2012-08-29 53 views
0

1:服务器文件大小复制到缓冲器并发送它:Ç套接字发送和接收int,而不是字符缓冲区

snprintf(t_buf, 255, "%" PRIu32, fsize); 
    if(send(f_sockd, t_buf, sizeof(t_buf), 0) < 0){ 
    perror("error on sending file size\n"); 
    onexit(f_sockd, m_sockd, 0, 2); 
    } 

2:客户端接收的文件大小,放入FSIZE :

if(recv(f_sockd, t_buf, sizeof(t_buf), 0) < 0){ 
    perror("error on receiving file size"); 
    onexit(f_sockd, 0 ,0 ,1); 
    } 
    fsize = atoi(t_buf); 

-----------------上面的代码使我的程序完美工作!

的问题发生,如果我写这样的代码,而不是以前的一个:
1:服务器发送FSIZE:

if(send(f_sockd, &fsize, sizeof(fsize), 0) < 0){ 
    perror("error on sending file size\n"); 
    onexit(f_sockd, m_sockd, 0, 2); 
    } 

2,客户端接收FSIZE:

if(recv(f_sockd, &fsize, sizeof(fsize), 0) < 0){ 
    perror("error on receiving file size"); 
    onexit(f_sockd, 0, 0, 1); 
    } 

uint32_t fsize;char t_buf[256];
问题是,使用第一种方法都可以工作,但使用第二种方法,客户端不会收到所有文件,只能收到一小部分文件。这段代码有什么问题?
谢谢!

+0

[处理从recv的部分回报(c)中TCP](可能重复http://stackoverflow.com/questions/1386142/handling-partial-return-from-recv-tcp-in-c) –

+0

看起来不像它,上面的代码只是错误的;-)。 –

+0

客户端和服务器在同一台机器上吗?只是它的一部分意味着什么? – hmjd

回答

0

很难说,没有更多的数据。

可能是endianness。你应该打印出fsize的值。

也可以从recv()部分返回,如评论中所述。

+0

小端,我在同一台机器上运行服务器和客户端! – polslinux

1

recv(2)不一定填写完整的输出缓冲区 - 这可能取决于有多少数据返回较少的字节可用:

的接听电话正常返回的任何数据可用,直到请求的数量,而比等待收到所要求的全部金额。

返回值(当> 0时)将是接收到的字节数,因此如果您想确保接收所有内容,则可以在循环中调用它。

或者,您可以通过MSG_WAITALL标志:

此标志请求的操作块,直到完全满足请求。但是,如果捕获到信号,发生错误或断开连接,或者接收到的下一个数据的类型与返回的数据类型不同,那么调用返回的数据的数据量可能会比请求数少。

你的情况

所以,你可以这样做:

ssize_t bytes = recv(f_sockd, &fsize, sizeof(fsize), MSG_WAITALL); 

if(bytes == sizeof(fsize)) 
{ 
    /* received everything */ 
} 
else 
{ 
    /* something went wrong */ 
} 
+0

服务器发送20个字节,客户端收到1801745249 O.o为什么? :( – polslinux