处理接收数据的服务器代码:
while (1)
{
/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved];
if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) {
send(connected, "disconnected",strlen("disconnected"), 0);
fflush(stdout);
close(connected);
break;
} else if(strcmp(recv_data , "lala") == 0) {
printf("\n RECIEVED DATA = %s " , recv_data);
send(connected, "showMe",strlen("showMe"), 0);
fflush(stdout);
} else {
printf("\n RECIEVED DATA = %s " , recv_data);
send(connected, "Could not find",strlen("Could not find"), 0);
fflush(stdout);
}
fflush(stdout);
}
发送数据的客户端代码:
// Sending
printf("Please enter the message: ");
fgets(send_data,1024,stdin); // send_data is the string -> char send_data[1024]
// Receive
bytes_recieved=recv(sock,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';
printf("\nRecieved data = %s " , recv_data);
但是,我的结果总是:
Could not find
即使我发送(来自客户):q或Q或lala
我查了Cplusplus网站,我很确定,strcmp在匹配2个字符串时返回0。任何人都可以提供帮助,为什么它总是返回“找不到”的消息?
EDIT =>弗雷德里克:
添加后:
printf("recv_data: \"%s\"\n", recv_data)
来自我发送的客户:lala
结果:
recv_data: "lala
"
另一个双引号在第二行
答案 0 :(得分:0)
看起来像你在使用C字符串,在这种情况下:
if(recv_data == "q" || recv_data == "Q")
应该是:
if(recv_data[0] == 'q' || recv_data[0] == 'Q')
另外,没有检查看到你实际上收到了一些数据(或者是否存在套接字错误!),也没有清除接收缓冲区(使用memset
或将其后的+ 1个字符串清零在使用之前,这导致了我的问题。
答案 1 :(得分:0)
recv()函数只将字节写入字符串,它不会追加正确结束它所需的null character terminator。看起来你试图自己这样做:
/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved];
但那应该是:
/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';
编辑:您发送的字符串以换行符结尾。您可能需要在服务器代码中删除它:
/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
if (bytes_recieved > 0 && recv_data[bytes_recieved - 1] == '\n') {
--bytes_recieved; // Overwrite the newline with the null terminator.
}
recv_data[bytes_recieved] = '\0';
答案 2 :(得分:0)
我感觉到了陈述
recv_data[bytes_recieved];
应该是
recv_data[bytes_recieved] = '\0';
这将确保缓冲区为空终止并用于字符串比较