如何在C ++中通过Linux中的socket读取客户端的输入?

时间:2011-10-09 09:35:25

标签: c++ string network-programming

我的目标是创建一个用C ++编写的app客户端服务器。 当服务器从客户端读取输入时,应处理字符串并给出输出。 基本上,我有一个简单的echo服务器发送相同的消息。 但是如果用户键入一个特殊字符串(如“退出”),程序必须执行其他操作。 我的问题是这个不会发生,因为字符串之间的比较不起作用...我不知道为什么! 这是一个简单的代码:

  while(1) {
            int num = recv(client,buffer,BUFSIZE,0);
            if (num < 1) break;
            send(client, ">> ", 3, 0);
            send(client, buffer, num, 0);

            char hello[6] ="hello";
            if(strcmp(hello,buffer)==0) {
                send(client, "hello dude! ", 12, 0);
            }

            buffer[num] = '\0';
            if (buffer[num-1] == '\n')
                buffer[num-1] = '\0';
            std::cout << buffer;
            strcpy(buffer, "");
        }

为什么比较不起作用? 我尝试了很多解决方案......但都失败了:(

3 个答案:

答案 0 :(得分:2)

buf中的数据可能不会以NULL结尾,因为如果未初始化,buf包含随机数据。您只知道第一个num字节的内容。因此,在比较字符串之前,您还必须检查您收到了多少数据:

const char hello[6] ="hello";
size_t hello_sz = sizeof hello - 1;
if(num == hello_sz && memcmp(hello, buffer, hello_sz) == 0) { ...

作为旁注,除非你划分你的消息,否则这个协议将是脆弱的,所以如果读取碎片(第一次读取时收到“hel”,第二次读取“lo”),你可以知道一条消息的起始位置和另一个人结束了。

答案 1 :(得分:0)

strcmp需要以null结尾的字符串。您收到的缓冲区在收到消息后可能包含非空字符。

在阅读之前:

ZeroMemory(buffer, BUFSIZE); //or your compiler defined equivalent

或者在阅读之后

buffer[num] = '\0';

这将确保在收到的消息结尾处有一个终止空值,并且比较应该有效。

答案 2 :(得分:0)

string 被定义为char s的数组,包括终止\0字节。最初,您的buffer包含任意字节,甚至不保证包含字符串。您必须设置buffer[num] = '\0'才能使其成为字符串。

这当然意味着recv不应该读取sizeof buffer个字节,而是少一个字节。