为什么用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行