我正在尝试解决能够从一个套接字读取然后在没有阻塞的情况下写入另一个套接字并且在没有使用splice()的情况下不进行缓冲的问题。
作为第一个通过解决方案,我想到的是查询写套接字上的发送缓冲区的剩余大小,从读取套接字读取那么多,然后写入那么多写入套接字知道我们无法阻止
我发现有人在https://stackoverflow.com/a/9982492/4598583声称要查询剩余的缓冲区大小,您可以执行以下操作:
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &send_buf, &optlen);
但是,我找不到SO_SNDBUF是否会返回最大缓冲区大小或剩余缓冲区大小的引用。
是否可以确认是否可以查询剩余(非最大)缓冲区大小?
或者,当一个写套接字指示该套接字是可写的时(通过poll()或其他一些机制),在这种情况下,你可以在没有阻塞或截断的情况下在任何地方定义最小数据大小吗?
答案 0 :(得分:1)
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class TabPagerAdapter extends FragmentPagerAdapter {
int tabCount;
public TabPagerAdapter(FragmentManager fm, int numberOfTabs) {
super(fm);
this.tabCount=numberOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
Introduction tab1= new Introduction();
return tab1;
default:
return null;
}
}
不提供发送缓冲区的剩余大小,但最大大小。这应该是操作系统每次可以发送的最大缓冲区,或者是阻塞时发送的最大缓冲区。所以它应该适合你的需要。
来自Linux手册:
SO_SNDBUF 以字节为单位设置或获取最大套接字发送缓冲区。该 内核将此值加倍(以便为记账留出空间 使用setsockopt(2)设置它时,这个加倍 值由getsockopt(2)返回。默认值已设置 通过/ proc / sys / net / core / wmem_default文件和最大值 允许值由/ proc / sys / net / core / wmem_max文件设置。 此选项的最小(加倍)值为2048。