socket之send与发送缓冲区大小的关系

当使用send函数发送的数据长度超过socket发送缓冲区大小时,系统会自动分次发送。在Windows和Linux上,无论是阻塞还是非阻塞模式,send都会将大数据分帧进行传输。例如,发送3K数据到缓冲区大小为2K的socket,在不同系统中表现为分三次发送,每次发送的字节数接近缓冲区大小。
摘要由CSDN通过智能技术生成

     关于send函数在发送的数据长度大于发送缓冲区大小,或者大于发送缓冲区剩余大小时,socket会怎么反应。参见这篇博客的两种说法http://blog.csdn.net/gukesdo/article/details/7295592

自己做了个测试,服务器只起socket在侦听,不recv, 也不send.

//ubuntu10.04 32bit

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
 
int main(void)
{
    int fd;
    struct sockaddr_in addr;

    fd = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(103);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    listen(fd,5);
}

客户端,将发送缓冲区大小设置成2k,然后一次发送3k的数据。

//ubuntu10.04 32bit

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
int main()
{
    int fd,ret,tmp,sendlen;
    struct sockaddr_in addr;
    char *buf;
    int sendBufLen = 1024*2;
    socklen_t optlen = sizeof(int);

    buf = (char *)malloc(1024 * 3);	
    fd = socket(AF_INET, SOCK_STREAM,0 );

    setsockopt(fd,SOL_SOCKET, SO_SNDBUF,(const char*)&sendBufLen, sizeof(int));
    getsockopt(fd,SOL_SOCKET, SO_SNDBUF,(int *)&tmp, &optlen);
    printf("send_tmp=%d,optlen=%d\n",tmp,(int)optlen);    //设置发送缓冲区2048
   
    getsockopt(fd,SOL_SOCKET, SO_RCVBUF,(int *)&tmp, &optlen);
    printf("recv_tmp=%d,optlen=%d\n",tmp,(int)optlen);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(103);
    addr.sin_addr.s_addr = inet_addr("222.111.112.204"); //填上自己的IP
    
    ret = connect (fd, (struct sockaddr *)&addr, sizeof(addr));
    printf("connect return %d\n",ret);
    getchar();
    if (ret >= 0)
	sendlen = send(fd,buf,1024*3,0);
    printf("sendlen=%d\n"
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值