Winsock只收了一行

时间:2012-04-29 10:46:31

标签: c++ winsock getline

我对c ++很新,并尝试了一些套接字编程。我的问题是,我无法让x = recv((SOCKET)this->sock, ausgabe, 1000, 0);一次只返回一行,这些行被\n\r拆分。

我尝过这样的话:

        char * pos;
        pos = strstr(ausgabe, "\n");
        while(pos != NULL){
            std::cout<< pos;
            pos = strstr(pos, "\n");
        }

但这不会按预期工作。我希望你知道这个问题并找到了解决方案来帮助我。

问候, 弗雷德里克

2 个答案:

答案 0 :(得分:2)

您可以一次读取一个字节并检查'\ r \ n',但效率非常低。

您应该始终从套接字到缓冲区读取尽可能多的字节,然后使用strstr()解析缓冲区。

是UDP之类的数据报套接字还是TCP之类的流套接字?他们是不同的。

答案 1 :(得分:1)

您可以使用令牌库:

#include <string.h>
.
.
char *line = strtok(ausgabe,"\n");
while (line != NULL)
{
    line[strlen(line)-1] = '\0';    // if newline character is \r\n
    cout << line;
    line = strtok(NULL, "\n");
    // line++; // ignore \r         // if newline character is \n\r
}

演示:http://codepad.org/DYL1bjtb

有关标记化http://www.cplusplus.com/reference/clibrary/cstring/strtok/

的详细信息