从TCP套接字C读取

时间:2014-09-28 12:16:10

标签: c sockets tcp

我不明白为什么函数read总是返回-1。我想从套接字读取,直到'\ n'出现!

    char* msg = (char*)malloc(sizeof(char)*120);
    nleft = sizeof(msg);
    while(nleft>0){
        n = read(fdTcp, msg, nleft);
        if(n == -1){
            printf("error reading UPC\n");
            exit(1); //error
        }   
        else if (n == 0){
            printf("end of reading EOF\n");
            break; //closed by peer
        }   
        nleft-=n;
        msg += n;
    }
    nread = n-nleft;
    msg[nread] = '\0';
    printf("mensagem do CS: %s\n", msg);

提前致谢!

2 个答案:

答案 0 :(得分:2)

char* msg = (char*)malloc(sizeof(char)*120);
nleft = sizeof(msg);

由于msgchar*nleft将是char*中的字节数。我认为这不是你想要的。

至于回答你的真实问题:

  

但我现在不会读到多少字节,我想准备好直到我到达'\ n'我该怎么办?

你有两个选择。可怕的选择是一次读取一个字节,直到您读取换行符。更好的选择是尽可能多地阅读并检查换行符。如果你读过新行,那就太好了,那就是你下次通行时不得不做的工作。在伪代码中:

  1. 如果缓冲区中至少有一个换行符,请跳至步骤5.

  2. 从缓冲区中提取字符到第一个换行符并处理它们。

  3. 将任何超过换行符的字节移动到缓冲区的开头,并调整缓冲区的大小以包含那些字节。

  4. 转到第1步。

  5. 执行阻塞读取并将数据附加到缓冲区。

  6. 转到第1步。

答案 1 :(得分:0)

我假设您的套接字成功打开套接字连接。  然后文件discriptor为1表示准备好读取数据。您尝试读取套接字,但是您使用了-1的错误。       通常,当套接字关闭时会出现此错误。如果你取-1,socket就关闭了。如果取0表示读取套接字数据超时。另一方面,如果你花费超过0这意味着,读取多少字节。