send()和recv()函数

时间:2014-03-26 21:26:43

标签: c sockets network-programming

我正在尝试设置服务器/客户端模型。客户端将从用户接收两个矩阵,然后将这两个矩阵发送到服务器,然后服务器将计算其产品并将结果发送回客户端,客户端将打印结果。我将矩阵编码为C字符串并将它们发送到服务器,在那里它应该被解码。我的代码如下:

客户端使用以下代码发送两个矩阵:

send_all( sockfd, send_str, strlen(send_str) );
shutdown( sockfd, SHUT_WR ); // Close the write side of socket, since sending is done.

send_all的位置:

void send_all( int socket, char *data, size_t len )
{
    size_t i;
    for( i = 0; i < len; i += send( socket, data, len - i, 0 );
    {
        printf("%d bytes sent to server.\n", len - i); // To confirm send to user
    }
}

我的服务器然后按如下方式接收数据:

while( len = recv( connfd, buffer, MAX_LINE, 0 ) > 0 )
{
    printf("%d bytes read.\n", len); // To confirm receive to user.
    buffer[len] = '\0';
    strcat(input, buffer);
}
if( len < 0 )
{
    printf("Read error.");
}

然后服务器解析字符串并计算产品,然后以与客户端相同的方式发送数据,客户端以与服务器相同的方式接收数据。

当我运行此程序时,客户端打印它已发送正确的字节数,例如:

406 bytes sent to server.

然后服务器打印(一致地,无论我发送的字符串的大小):

72720 bytes read.

并且在尝试打印字符串时,它似乎是垃圾。

我使用本地主机127.0.0.1在单独的Cygwin终端中运行客户端和服务器,看起来它们连接成功。

我做错了什么?我是否以正确的方式发送/接收数据?我的方法会导致inputsend_str相同吗?谢谢你的帮助。

编辑:我在这里看到了很多问题,其中解决了send()和recv()的困难,但我没有找到解释为什么当只有很少的字节数时,recv会返回如此大的数字发送。

2 个答案:

答案 0 :(得分:4)

  编辑:我在这里看到了很多问题,其中解决了send()和recv()的困难,但我没有找到解释为什么当只有很少的字节数时,recv会返回如此大的数字发送。

我认为len不正确,因为运营商“=”的优先级低于运营商“&gt;”。您可以尝试使用括号。

您可以在以下示例中看到len具有不同的值:

#include <stdio.h>                                                                                  

int f()                                                                                             
{                                                                                                   
    return 40;                                                                                      
}                                                                                                   
int main()                                                                                          
{                                                                                                   
    int len;                                                                                        
    if(len = f() > 0)                                                                               
    {                                                                                               
        printf("len = %d\n", len);                                                                  
    }                                                                                               


    if((len = f()) > 0)                                                                             
    {                                                                                               
        printf("len = %d\n", len);                                                                  
    }                                                                                               
    return 0;                                                                                       
}         

答案 1 :(得分:1)

首先:打印size_t使用"zu".

如果修饰符"z"不可用,请检查size_t的大小,并使用"lu"(64位)或"u"(32位)。

在任何情况下"d"都有问题,因为它对于有符号整数而且size_t是无符号的。


此外,代码完全没有检查系统调用send()recv()是否存在错误。两者都返回错误((ssize_t) -1),签名值。


此外,^ 2代码忽略了这样一个事实:recv()可能会因为被告知接收而返回少量内容。