为什么用socket的send和recv传数据,总会丢失一些数据
用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行
命令行:
./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行
...全文
相关推荐
socket send和recv详解
Socket 编程中的 send 和 recv 函数详解在 Socket 编程中,send 和 recv 函数是最基本的网络通信函数。它们用于在客户端和服务端之间传递数据。
Socket send函数和recv函数详解
Socket的send函数是网络编程中至关重要的组成部分,特别是在TCP/IP通信中,它用于客户端和服务器之间数据的双向传输。send函数的主要作用是将应用程序的数据发送到指定的套接字(SOCKET)
send函数 和recv函数
### send函数与recv函数详解在计算机网络编程中,socket编程是实现进程间通信的一种重要方式,其中`send`函数和`recv`函数是进行数据发送与接收的关键接口。
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值.zip
在设计网络应用程序时,需要根据需求选择合适的模式,并正确处理这些函数的返回值,以避免可能导致程序崩溃或数据丢失的错误。同时,合理的错误处理和超时机制也是必不可少的,以应对可能出现的各种异常情况。
socket_recv函数使用心得.
在 Windows 平台下,使用 winsock 函数时,recv 函数也会返回-1,但是如果没有设置超时,send 和 recv 函数都会堵住不动。


