【发布时间】:2015-08-30 04:17:10
【问题描述】:
我正在用C编写一个服务器-客户端程序。客户端以5个字节的形式向服务器发送一个命令:第一个字节是一个操作,接下来的4个字节是执行操作的关键.
服务器看起来像这样:
int nowread, key;
while(1)
{
char buffer[1024];
int alreadyread = 0;
do
{
nowread = read(socket,buffer+alreadyread,5-alreadyread);
alreadyread += nowread;
}
while((nowread > 0) && (5-alreadyread > 0));
if(nowread == -1 || nowread == 0)
{
printf("Error reading from client socket\n");
exit(1);
}
key = (((int)buffer[1])<<24 | ((int)buffer[2])<< 16 | ((int)buffer[3]) << 8 | ((int)buffer[4]) << 0);
printf("%d, key from server \n",key); // just for debugging
//DO COMMAND
我一直在通过让客户端发送 10 个命令来测试程序:
op: 1, num: 645110
op: 2, num: 419811
op: 0, num: 115300
op: 2, num: 792023
op: 2, num: 146624
op: 1, num: 842346
op: 1, num: 450778
op: 0, num: 550046
op: 1, num: 284186
op: 2, num: 691858
我从服务器获取:
-10, key from server
-29, key from server
-15772, key from server
-41, key from server
-64, key from server
-9622, key from server
-38, key from server
-98, key from server
284186, key from server
-110, key from server
如您所见,只有一个键匹配,这很奇怪(它们应该都匹配或不匹配)。我 100% 确定这是服务器端,而不是客户端的问题。有谁知道是什么原因造成的?
提前致谢。
编辑: 这是发送数据的代码
uint32_t net_num = htonl(num);
int nsent = 0;
while (nsent < 4)
{
rc = write(sockfd,&net_num + nsent, 4 - nsent);
if (rc <= 0)
{
printf("error! write() failed: %s\n", strerror(errno));
break;
}
nsent += rc;
}
if (rc <= 0)
break;
【问题讨论】:
-
你如何发送数据?
-
显示发送数据的代码非常重要。您可能会遇到字节顺序问题或其他微妙问题。
-
你发送了四个字节,但接收到了五个,你是在给我们显示的数字之前发送一个字节吗?
-
您的大多数密钥都是负数的事实使我认为您在将密钥转换为值的方式方面遇到了签名问题。尝试将
buffer的类型更改为unsigned char的数组。 -
此外,如果您希望能够传输负键,则需要更加小心,因为对有符号整数值的任何算术运算,其数学结果不在可表示的范围内目标类型产生未定义的行为。