`
zhangyafei_kimi
  • 浏览: 265278 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

SO_RCVBUF选项的大小和接受窗口字节数关系

阅读更多
运行下面程序的同时打开任何一个抓包工具分析。

实验表明Windows下面SO_RCVBUF选项的大小和接受窗口字节数无关。
窗口大小都是8192。

Linux 2.6.27中窗口大小和SO_RCVBUF选项有关,好像是进位到下一个1460的整数倍,例如:
1024->1460
2500->2920


/*
作者:张亚霏
2008-12-08晚
*/



#if defined WIN32 || defined _WIN32


#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int init_net()
{
	WSADATA wsa_data;
	return 0 != WSAStartup(MAKEWORD(2,2), &wsa_data);
}

void uninit_net()
{
	WSACleanup();
}

int close_socket(SOCKET s)
{
	return closesocket(s);
}

int get_last_error()
{
	return WSAGetLastError();
}
#else

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>

int init_net()
{
	return 1;
}

void uninit_net()
{
}


typedef int SOCKET;

int close_socket(SOCKET s)
{
	return close(s);
}

int get_last_error()
{
	return errno;
}
#endif



#define BUFFER_SIZE 1024
#define DEST_ADDRESS "1.2.3.4"//"192.168.1.2"
#define DEST_PORT 27015//1037


int main()
{
	int recv_buf_size = 1024;
	SOCKET send_socket;
	struct sockaddr_in recv_addr;
	char send_buf[BUFFER_SIZE];
	char recv_buf[BUFFER_SIZE];
	int ret;

	fd_set read_set;
	struct timeval time_out;

	init_net();

	send_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	
	setsockopt(send_socket, SOL_SOCKET, SO_RCVBUF, &recv_buf_size, sizeof(recv_buf_size));
	recv_addr.sin_family = AF_INET;
	recv_addr.sin_port = htons(DEST_PORT);
	recv_addr.sin_addr.s_addr = inet_addr(DEST_ADDRESS);


	ret = connect(send_socket, (struct sockaddr*) &recv_addr, sizeof(recv_addr));

	if(ret == -1)
	{
		printf("get_last_error() %d\n", get_last_error());
		perror(NULL);
	}

	close_socket(send_socket);
	uninit_net();
	return 0;
}
分享到:
评论

相关推荐

    tcp滑动窗口和SO-RCVBUF

    tcp滑动窗口和SO_RCVBUFtcp滑动窗口和SO_RCVBUF

    VC套接字选项—修改缓冲区大小

    而SO_RCVBUF和SO_SNDBUF这两个选项分别用于设置接收和发送缓冲区的大小。 SO_RCVBUF选项允许我们设置接收缓冲区的大小,这直接影响到套接字能够接收的最大数据量。增大接收缓冲区可以提高接收数据的速度,但会消耗...

    Linux下socket设置.pdf

    4. **调整缓冲区大小(SO_RCVBUF, SO_SNDBUF)**:默认情况下,Socket的接收和发送缓冲区大小有限。增大这些缓冲区可以减少`send`和`recv`的调用次数,提高效率。例如,将接收缓冲区设置为32KB(`setsockopt(s, SOL_...

    setsockopt 设置socket 详细用法.doc

    通过调整`SO_RCVBUF`和`SO_SNDBUF`选项,可以增加缓冲区大小,提高数据处理效率。 ```c int nRecvBuf = 32 * 1024; // 设置为32K setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)); int...

    socket选项说明

    这里,`SOL_SOCKET` 表示这些选项属于Socket层,而 `SO_SNDBUF` 和 `SO_RCVBUF` 分别代表发送和接收缓冲区的大小。通过调用 `getsockopt()`,程序可以获取这两个缓冲区的当前配置,并据此调整网络通信策略。 #### ...

    Linux下socket设置[借鉴].pdf

    通过`SO_RCVBUF`和`SO_SNDBUF`选项设置接收和发送缓冲区大小: ```c int nRecvBuf = 32 * 1024; // 设置为 32K setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)); // 接收缓冲区 int ...

    Socket选项设置含义[归类].pdf

    例如,如果编写一个ping程序,可能需要关注SO_BROADCAST和SO_RAW选项,以发送广播ICMP请求。对于TCP服务器,SO_REUSEADDR可以帮助快速重启服务,而SO_LINGER可以控制关闭连接的策略。 总之,理解并正确使用`...

    liunx课件关于shell

    例如,`SO_LINGER`可以用于确保数据在关闭连接前被完全发送,而`SO_SNDBUF`和`SO_RCVBUF`则可以调整网络通信的性能,通过增大缓冲区大小来减少数据包丢失。 在Linux Shell编程中,了解和掌握这些系统调用能够帮助...

    setsockopt

    4. **调整发送/接收缓冲区大小(SO_SNDBUF/SO_RCVBUF)** 默认情况下,系统会为套接字分配一定的发送和接收缓冲区大小。但在某些场景下,可能需要增大这些缓冲区以提高性能: ```c int nRecvBuf = 32 * 1024; /...

    linux 网络编程 socket选项的实现

    Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。这些选项在...

    setsockopt参数详解

    * SO_RCVBUF:接收缓冲区大小。 * SO_SNDBUF:发送缓冲区大小。 * SO_RCVLOWAT:接收缓冲区下限。 * SO_SNDLOWAT:发送缓冲区下限。 * SO_RCVTIMEO:接收超时。 * SO_SNDTIMEO:发送超时。 * SO_REUSERADDR:允许...

    setsockopt函数一片不错的文章

    对于大数据量的传输,可以使用`SO_RCVBUF`和`SO_SNDBUF`选项增大缓冲区大小,例如设置为32KB,减少多次循环收发的需要。 5. **禁用系统到Socket缓冲区的拷贝**: 通过将`SO_SNDBUF`的值设为0,可以避免系统缓冲区...

    linux 网络驱动开发经验收集

    - `SO_RCVBUF`:设置接收缓冲区的大小,同样有上下限,并会更新`sock-&gt;sk-&gt;sk_rcvbuf`。 - `SO_KEEPALIVE`:启用或禁用TCP保活定时器,仅对TCP套接字有效,同时设置`sock-&gt;sk-&gt;sk_flag`中的SOCK_KEEPOPEN标志。 - `...

    UDP广播的收发、打印socket默认缓冲区的大小(练习)

    打印默认接收缓冲区大小可以使用getsockopt函数,传入SO_RCVBUF选项,获取到的就是当前socket的接收缓冲区大小。 实践此练习时,你需要创建一个UDP socket,然后启用广播功能。接着,你可以编写一个程序来发送广播...

    setsockopt()改善程序的健壮性

    可以使用`SO_RCVBUF`和`SO_SNDBUF`选项来增加这些缓冲区的大小: ```c++ int nRecvBuf = 32 * 1024; // 32KB setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)); int nSendBuf = 32 * ...

    socket的属性设置测试代码

    - `optname`:指定要获取或设置的具体选项,如SO_RCVBUF(接收缓冲区大小),SO_SNDBUF(发送缓冲区大小)等。 - `optval`:用于存放选项值的指针,设置时填入新值,获取时存放返回值。 - `optlen`:在设置时,表示`...

    socket_recv函数使用心得.

    * SO_SNDBUF、SO_RCVBUF:用于设置套接字的发送和接收缓冲区的大小。 * SO_ERROR:套接字上发生了异步错误,系统将设置套接字的SO_ERROR,getsockopt 调用后 so_error 的值将自动初始化。 在使用 socket 函数时,...

    java实现流量控制流量控制

    Java的Socket类还提供了设置发送缓冲区(SO_SNDBUF)和接收缓冲区(SO_RCVBUF)大小的方法。通过调整这两个选项,可以控制发送和接收数据的速度,从而实现流量控制。但要注意,实际的缓冲区大小可能受到操作系统...

    TCP SOCKET用法小结v1.1.doc

    例如,SO_RCVBUF和SO_SNDBUF可以调整接收和发送缓冲区的大小,SO_KEEPALIVE可启用连接保持,而SO_LINGER控制连接关闭时的行为。 6. **选项设置** - 通过setsockopt(),开发者可以自定义socket的行为,例如设置广播...

Global site tag (gtag.js) - Google Analytics