繁体   English   中英

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

[英]How can I better read my socket?

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

这是读取功能:

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);
}

有什么建议么?

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

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

编辑0:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM