c比较问题

时间:2010-11-26 06:33:42

标签: c sockets

处理接收数据的服务器代码:

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
"

另一个双引号在第二行

3 个答案:

答案 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'; 

这将确保缓冲区为空终止并用于字符串比较