我怎样才能更好地阅读我的插座?

时间:2011-02-06 22:11:35

标签: c sockets

每次循环时它都会卡住。它坐着等待阅读,但从未读过任何东西,因为,好吧......没有什么可读的了。

这是读取功能:

int  readSocket(int sockfd, char* buffer) {

    FILE* file;
    file = fopen("logfile.txt","a+");

    char code[5];

    while(1) {

        int nBytes = read(sockfd, buffer, MY_BUFFER_SIZE);
        fprintf(file,"S->C: %s",buffer);

        strncpy(code, buffer,4); 
        code[4]='\0';



            if (nBytes == 0) break;

        memset(buffer, 0, MY_BUFFER_SIZE);

    }
    fclose(file);
    return codeParser(atoi(code));
}

这就是所谓的:

while (1) {
    serverCode = readSocket(sockfd, mybuffer);
    if (serverCode == 221) break;

    fflush (stdout);
    buffer = fgets (mybuffer, 1024, stdin); 

    writeSocket(sockfd, mybuffer);
}

有什么建议吗?

1 个答案:

答案 0 :(得分:8)

TCP套接字是双向流。它不知道您的消息边界。您需要在TCP之上使用自己的协议来计算单独的消息。 Two 三种常见的方法是:

  • 固定长度的消息,
  • 嵌入到固定长度邮件头中的邮件的长度,
  • 显式消息分隔符,例如换行符,或\0x1等等(谢谢,@ caf)。

编辑0:

关于您的代码的一些注意事项:

  1. 始终检查系统调用的返回值,例如read(2)。首先,它可能是-1,即错误,因此您必须检查errno(3);第二,你可能会读到你期望的不到4个字节。
  2. nBytes == 0EOF案例,意味着另一方关闭了连接。
  3. 您不需要memset()那里。