`
zhangyafei_kimi
  • 浏览: 267573 次
  • 性别: 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;
}
分享到:
评论

相关推荐

    java实现流量控制流量控制

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

    tcp.udp高级编程

    此外,TCP的套接字选项如SO_RCVBUF和SO_SNDBUF可以调整缓冲区大小,影响性能。 在UDP通信中,因为没有连接状态,所以数据发送方需要知道接收方的IP和端口,而接收方可以通过bind函数绑定本地端口,然后使用recvfrom...

    高级编程试题

    6. **套接口选项**:套接口选项如SO_DONTLINGER、SO_RCVBUF、SO_SNDBUF、SO_REUSEADDR和SO_MAX_MSG_SIZE分别对应不同的功能,如控制数据发送、接收缓冲区大小、允许地址重用等。 7. **进程和线程**:进程是资源分配...

    Windows Sockets网络编程 可能是最清晰版本(Windows Sockets 2规范解释小组负责人亲自执笔。)总共4个包,part1

    9.2.11 SO_RCVBUF与SO_SNDBUF 9.2.12 SO_REUSEADDR 9.2.13 SO_TYPE 9.2.14 TCP_NODELAY 9.2.15 不支持的选项 9.2.16 未来会使用的选项 9.3 阻塞钩子 9.3.1 WSASetBlockingHook 9.3.2 WSAUnhookBlockingHook 9.3.3 ...

    Windows Sockets网络编程 总计4个包,part2

    9.2.11 SO_RCVBUF与SO_SNDBUF 9.2.12 SO_REUSEADDR 9.2.13 SO_TYPE 9.2.14 TCP_NODELAY 9.2.15 不支持的选项 9.2.16 未来会使用的选项 9.3 阻塞钩子 9.3.1 WSASetBlockingHook 9.3.2 WSAUnhookBlockingHook 9.3.3 ...

Global site tag (gtag.js) - Google Analytics