运行下面程序的同时打开任何一个抓包工具分析。
实验表明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_RCVBUFtcp滑动窗口和SO_RCVBUF
而SO_RCVBUF和SO_SNDBUF这两个选项分别用于设置接收和发送缓冲区的大小。 SO_RCVBUF选项允许我们设置接收缓冲区的大小,这直接影响到套接字能够接收的最大数据量。增大接收缓冲区可以提高接收数据的速度,但会消耗...
4. **调整缓冲区大小(SO_RCVBUF, SO_SNDBUF)**:默认情况下,Socket的接收和发送缓冲区大小有限。增大这些缓冲区可以减少`send`和`recv`的调用次数,提高效率。例如,将接收缓冲区设置为32KB(`setsockopt(s, SOL_...
通过调整`SO_RCVBUF`和`SO_SNDBUF`选项,可以增加缓冲区大小,提高数据处理效率。 ```c int nRecvBuf = 32 * 1024; // 设置为32K setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)); int...
这里,`SOL_SOCKET` 表示这些选项属于Socket层,而 `SO_SNDBUF` 和 `SO_RCVBUF` 分别代表发送和接收缓冲区的大小。通过调用 `getsockopt()`,程序可以获取这两个缓冲区的当前配置,并据此调整网络通信策略。 #### ...
通过`SO_RCVBUF`和`SO_SNDBUF`选项设置接收和发送缓冲区大小: ```c int nRecvBuf = 32 * 1024; // 设置为 32K setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)); // 接收缓冲区 int ...
例如,如果编写一个ping程序,可能需要关注SO_BROADCAST和SO_RAW选项,以发送广播ICMP请求。对于TCP服务器,SO_REUSEADDR可以帮助快速重启服务,而SO_LINGER可以控制关闭连接的策略。 总之,理解并正确使用`...
例如,`SO_LINGER`可以用于确保数据在关闭连接前被完全发送,而`SO_SNDBUF`和`SO_RCVBUF`则可以调整网络通信的性能,通过增大缓冲区大小来减少数据包丢失。 在Linux Shell编程中,了解和掌握这些系统调用能够帮助...
4. **调整发送/接收缓冲区大小(SO_SNDBUF/SO_RCVBUF)** 默认情况下,系统会为套接字分配一定的发送和接收缓冲区大小。但在某些场景下,可能需要增大这些缓冲区以提高性能: ```c int nRecvBuf = 32 * 1024; /...
Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。这些选项在...
* SO_RCVBUF:接收缓冲区大小。 * SO_SNDBUF:发送缓冲区大小。 * SO_RCVLOWAT:接收缓冲区下限。 * SO_SNDLOWAT:发送缓冲区下限。 * SO_RCVTIMEO:接收超时。 * SO_SNDTIMEO:发送超时。 * SO_REUSERADDR:允许...
对于大数据量的传输,可以使用`SO_RCVBUF`和`SO_SNDBUF`选项增大缓冲区大小,例如设置为32KB,减少多次循环收发的需要。 5. **禁用系统到Socket缓冲区的拷贝**: 通过将`SO_SNDBUF`的值设为0,可以避免系统缓冲区...
- `SO_RCVBUF`:设置接收缓冲区的大小,同样有上下限,并会更新`sock->sk->sk_rcvbuf`。 - `SO_KEEPALIVE`:启用或禁用TCP保活定时器,仅对TCP套接字有效,同时设置`sock->sk->sk_flag`中的SOCK_KEEPOPEN标志。 - `...
打印默认接收缓冲区大小可以使用getsockopt函数,传入SO_RCVBUF选项,获取到的就是当前socket的接收缓冲区大小。 实践此练习时,你需要创建一个UDP socket,然后启用广播功能。接着,你可以编写一个程序来发送广播...
可以使用`SO_RCVBUF`和`SO_SNDBUF`选项来增加这些缓冲区的大小: ```c++ int nRecvBuf = 32 * 1024; // 32KB setsockopt(s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)); int nSendBuf = 32 * ...
- `optname`:指定要获取或设置的具体选项,如SO_RCVBUF(接收缓冲区大小),SO_SNDBUF(发送缓冲区大小)等。 - `optval`:用于存放选项值的指针,设置时填入新值,获取时存放返回值。 - `optlen`:在设置时,表示`...
* SO_SNDBUF、SO_RCVBUF:用于设置套接字的发送和接收缓冲区的大小。 * SO_ERROR:套接字上发生了异步错误,系统将设置套接字的SO_ERROR,getsockopt 调用后 so_error 的值将自动初始化。 在使用 socket 函数时,...
Java的Socket类还提供了设置发送缓冲区(SO_SNDBUF)和接收缓冲区(SO_RCVBUF)大小的方法。通过调整这两个选项,可以控制发送和接收数据的速度,从而实现流量控制。但要注意,实际的缓冲区大小可能受到操作系统...
例如,SO_RCVBUF和SO_SNDBUF可以调整接收和发送缓冲区的大小,SO_KEEPALIVE可启用连接保持,而SO_LINGER控制连接关闭时的行为。 6. **选项设置** - 通过setsockopt(),开发者可以自定义socket的行为,例如设置广播...