为什么用socket的send和recv传数据,总会丢失一些数据

bob79 2004-01-13 08:41:35
用socket,从客户端读一个文件,传到服务端,总是有些数据丢失,为什么?
命令行:
./sever /home/data/socket/data/rec.dat
./client 10.1.22.xxx 2121 /home/data/socket/data/send.dat


客户端代码:./client 10.1.22.xxx 2121 /home/data/socket/data/rec.dat
sock = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
while( fgets( Buf,400,fp ) != NULL ) {
if (send(sock, Buf, sizeof(Buf),0) < 0){
perror("sending on stream socket");
return (-5);
}
i++;
}
printf("Client END:%ld",i) ;


服务端代码:
sock = socket(AF_INET, SOCK_STREAM, 0);
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(2121);
if( (SOCKET_ERROR = bind(sock,(struct sockaddr *)&server,sizeof(server) )) < 0)
while(1) {
msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (socklen_t *)&len);
if (msgsock == -1)
perror("accept");
else do{
memset(buf, 0, sizeof(buf));
if ((rval = recv(msgsock,buf,1024,0)) < 0)
perror("reading stream message");
if (rval == 0){
printf("ending connection \nServer END:%ld\n",k);
}
else {
fprintf(fp,"%s",buf);
k++;
}
}while (rval != 0);
close(msgsock);
}

从程序中printf结果看,客户端将一个文件的20000行全部读取并送出去:Client END:200000
服务端端也reve到了20000次:Server END:200000
但是,服务端的fprintf(fp,"%s",buf);中写文件就是比客户端读取的文件少了8行


...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
acqy 2004-01-15
  • 打赏
  • 举报
回复
你传送的是2进制文件吗?如果是的话,你就要考虑到文件中间有“\0”的字符。
wyly 2004-01-13
  • 打赏
  • 举报
回复
send函数不一定都能发出去,要判断返回值
fierygnu 2004-01-13
  • 打赏
  • 举报
回复
if (send(sock, Buf, sizeof(Buf),0) < 0){
应该是strlen(Buf),不是sizeof(Buf)。
samstay 2004-01-13
  • 打赏
  • 举报
回复
建议你将send和recv包装一下,确保每一个包都能发送完和收完。如:
int Send(int socket, const void* buf, int bytes, int flags = 0)
{
const char* b = (const char*)buf;
while (bytes > 0)
{
int r = send(socket, b, bytes, flags);
if (r < 0)
{
return r;
}
if (r == 0) break;
bytes -= r;
b += r;
}
return b - (char*)buf;
}
还有就是这里不要用sizeof来确定长度。
fierygnu 2004-01-13
  • 打赏
  • 举报
回复
呵呵,fgets读取的字符数目不一定是sizeof(Buf),必须用strlen来计算。
mosaic 2004-01-13
  • 打赏
  • 举报
回复
to fierygnu(va_list):
如果Buf是字符数组,而不是指针,如定义为char Buf[400],用sizeof没问题。
问题应该不是在这里。
to wyly() :楼主的send已经检测了返回值了。问题也不在这里。

会不会只是有几行没有换行符?比较一下两个文件的大小看看差多少字节。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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