【问题标题】:How to know when the socket has finished reading如何知道套接字何时完成读取
【发布时间】:2011-05-07 00:08:38
【问题描述】:

我对套接字知之甚少,但到目前为止我还没有遇到太多问题。我实际上被困在如何知道对方何时完成发送消息。到目前为止,我所拥有的是服务器端的一个while循环,它从套接字读取'直到什么都没有(或者这就是应该做的)。这是代码:

char c[1024]; //buffer
inst much;
while(much = read(sockfd, &c, 1024) > 0) {
   printf("read %d, clientSays> %s\n", much, c);
}
printf("reading, finished\n");

所以,在客户端,我发送了一条“hello world”消息,该消息实际上显示在服务器控制台上,但它不打印“阅读完成”消息,所以我想它在等待另一条消息时卡住了.

虽然当没有其他内容可读取时,read 函数会返回 0,但我想情况并非如此

那么,我做错了什么?


更新

实际上,在阅读了您的答案并稍微浏览了代码之后,我意识到这就是协议的用途。

我应该事先知道一方何时完成发送以及另一方何时开始写入。也许添加最后一个字符以告知我已发送完毕,或者添加消息的前缀大小。

感谢您的回答。

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    我知道这是一种可悲/低效的方法,但在过去我使用 char 分隔符来知道何时停止读取套接字。

    用手捂住头

    【讨论】:

    • 这真的没有错。实际上只有三种方法可以知道消息的结尾在哪里: 1)通过关闭整个连接来发出信号; 2) 用消息结束标记发出信号;或 3) 知道消息有多长(通过先发送长度,或者将其指定为协议的一部分)。 ASCII 甚至包括两个用于分隔消息的控制代码(STXETX)。
    • 哇,这么长时间以来,我都不好意思向人们展示我的游戏网络代码(当他们询问时)......因为我一直认为我在做的是“菜鸟”。谢谢哥们!
    • jajajaja,我知道我也会这样做。我不知道 ascii 分隔符,thanx。
    • XML 是 (2) 和/或 (3) 的一个重要特例:自描述协议。
    • 许多协议使用换行符作为消息结束标记,但您也必须注意回车。
    【解决方案2】:

    您的示例期望 read() 返回 0,这将在客户端关闭连接时发生。如果您必须保持连接打开但知道消息的结尾在哪里,您可以在每条消息前面加上它的长度,或者在结尾添加一个消息结束标记。套接字 API 中没有内置任何内容来帮助您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多