我正在尝试设置服务器/客户端模型。客户端将从用户接收两个矩阵,然后将这两个矩阵发送到服务器,然后服务器将计算其产品并将结果发送回客户端,客户端将打印结果。我将矩阵编码为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终端中运行客户端和服务器,看起来它们连接成功。
我做错了什么?我是否以正确的方式发送/接收数据?我的方法会导致input
与send_str
相同吗?谢谢你的帮助。
答案 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()
可能会因为被告知接收而返回少量内容。