socket 缓存区大小问题,高手求进

姑苏一梦 2014-01-14 10:48:07
#include "header.h"

#define MAXBUF 1024
typedef struct sockaddr SA;

int main(void)
{
int socketfd,socketfd_server;
struct sockaddr_in serveraddr,clientaddr;
char buffer[MAXBUF];
socklen_t addrlen;
int n;

if((socketfd=socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket fail");
exit(-1);
}

memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(8000);
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");

if(bind(socketfd,(SA *)&serveraddr,sizeof(serveraddr)) == -1)
{
perror("bind fail");
exit(-1);
}
if(listen(socketfd,10) == -1)
{
perror("listen fail");
exit(-1);
}
addrlen = sizeof(clientaddr);
if((socketfd_server=accept(socketfd,(SA *)&clientaddr,&addrlen)) == -1) //接收到客户端的消息
{
perror("accept fail");
exit(-1);
}
printf("a new connection :%d\n",socketfd_server); //打印socket连接套接字

int s_length;
int opt_l = sizeof s_length;

getsockopt(socketfd_server,SOL_SOCKET,SO_RCVBUF,&s_length,(socklen_t *)&opt_l); //输出接收缓冲区大小
printf("recv buffer = %d\n",s_length);

sleep(3000);
exit(0);
}





#include "header.h" 

#define MAXBUF 32768
typedef struct sockaddr SA;

int main()
{
int socketfd;
char client_buffer[MAXBUF];
struct sockaddr_in serveraddr,clientaddr;


if((socketfd=socket(AF_INET,SOCK_STREAM,0)) == -1) //调用TCP接口,创建套接字
{
perror("socket fail");
exit(-1);
}

serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(8000);
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");

if(connect(socketfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) == -1) //连接服务器套接字 connect()
{
perror("connect fail");
exit(-1);
}

int s_length;
socklen_t optl = sizeof s_length;

getsockopt(socketfd,SOL_SOCKET,SO_SNDBUF,&s_length,&optl); //获得连接套接字发送端缓冲区的信息
printf("send buffer = %d\n",s_length); // 发送缓冲区的大小

getsockopt(socketfd,SOL_SOCKET,SO_RCVBUF,&s_length,&optl); //获得连接套接字的接收端的缓冲区信息
printf("recv buffer = %d\n",s_length); //打印接收端缓冲区大小

int i = 0;
int sum = 0;
while(1){
memset(client_buffer,'\0',sizeof(client_buffer)); //清空缓冲区的数据
sprintf(client_buffer,"the message is %d\n",i++);
if(write(socketfd,client_buffer,MAXBUF) < 0) //写入缓冲区
{
perror("write fail");
exit(-1);
}

sum += MAXBUF;
printf("sum = %d\n",sum);
}

close(socketfd);
}


运行后的结果为:
客户端:
服务端:

由运行结果知道:我的socket 发送端缓冲区大小:170840
接收端缓冲区大小:87380

可为什么:170840+87380 远小于 391216?
...全文
439 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
姑苏一梦 2014-01-20
  • 打赏
  • 举报
回复
引用 1 楼 hairetz 的回复:
楼主在干嘛?想一次write大于发送缓冲区的数据?你先搞明白阻塞write和非阻塞write的区别,你把cli的代码设置为非阻塞,就可以知道了。 tcp阻塞会阻塞住,直到数据全部写入缓冲区为止,正常情况,都能写入的。 可以看下我这边文章: http://blog.csdn.net/hairetz/article/details/17968383
我不是想一次发送大于接收端的内容,而是,分批次去发,,,, 的
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
“亲,你打错电话了!”
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
想象一下,打一通电话,假设说话方一直说个不停,听话方脑中最多能缓存多少个字,直到缓存满了忍不住打断说话方?
  • 打赏
  • 举报
回复
楼主在干嘛?想一次write大于发送缓冲区的数据?你先搞明白阻塞write和非阻塞write的区别,你把cli的代码设置为非阻塞,就可以知道了。 tcp阻塞会阻塞住,直到数据全部写入缓冲区为止,正常情况,都能写入的。 可以看下我这边文章: http://blog.csdn.net/hairetz/article/details/17968383

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧