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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值