socket 缓存区大小问题,高手求进
#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?
...全文
相关推荐
Socket通信,通过异步,解决粘包问题
这个问题在处理结构化数据,如协议报文时尤为突出。解决粘包问题通常有以下几种策略:1. **设置合适的缓冲区大小**:为每个Socket设置合适的接收缓冲区大小,可以一定程度上避免粘包。
socketFTP用SOCKET传输任意大小的文件
选择合适的块大小需要根据网络状况和系统资源进行调整。5. **错误处理**:在文件传输过程中,可能会遇到各种错误,如网络中断、文件权限问题等。需要通过异常处理机制捕获并处理这些错误,确保传输的可靠性。
UDP广播的收发、打印socket默认缓冲区的大小(练习)
默认情况下,操作系统为socket分配一定的接收缓冲区大小,但这个大小可以通过setsockopt函数进行修改。
用SOCKET传输任意大小的文件
标题“用SOCKET传输任意大小的文件”涉及的是网络编程中的一个重要主题,即如何通过套接字(SOCKET)协议来实现大文件的传输。
python:socket传输大文件示例
- 客户端:创建Socket,连接到服务器端指定的IP和端口,然后发送文件信息(如文件名和大小)。


