【发布时间】:2010-02-06 18:28:19
【问题描述】:
你好。我正在学习网络课程,我们正在使用迄今为止在课堂上学到的套接字函数创建自己的“网络 API”。
对于这个任务,教授提供了已经完整的聊天和服务器程序,我们要填写一个空白的 .c 文件,该文件有一个相关的头文件,描述了聊天和服务器在我们的小“网络 API”中的函数调用使用的程序。
我即将完成,但遇到了问题。我打算进去弄乱我的代码,但是我的“网络 API”的所有其他部分都可以工作,所以当我快要完成并且有一点改变导致其他部分没有的时候,我不想搞砸它去工作。另外,我不能 100% 确定我确实知道我的错误是什么。
我的问题在于我的名为 recv_line 的函数应该模仿 recv()。
我的函数 recv_line 从客户端获得文件描述符,用于与服务器建立的连接。然后我继续使用 fdopen 将流与文件描述符相关联。这段代码看起来像:
// Associate a stream with the sock_fd
if (NULL == (fdstream = fdopen(sock_fd, "r"))) {
return -1;
}
现在这就是我认为我的错误所在的地方,但我不能 100% 确定,正如我所说的。首先,我第一次使用 recv_line 函数时效果很好。它实际上按预期进行了 recv_line 行。但问题又出现了第二次。
我使用 GDB 逐步完成了我的函数,上面的代码确实可以毫无问题地执行。然后我继续从我的流中剥离一个字符(使用 fgetc)并检查它是否等于 EOF 字符。如果是我返回,否则我将处理它。我第二次调用 recv_line 它返回因为它每次都读取 EOF 字符。
我假设发生这种情况是因为发送到客户端的数据位于原始流中(第一次创建的流),而第二次调用 fdopen 时,我创建的第二个流中没有任何数据?我不完全确定当我第二次调用 fdopen 时它是如何工作的?
在我的旁注中,我以这种方式读取数据,因为我们应该继续读取数据,直到我们读取 EOF 或字符序列 \r\n。我将 getc 和 ungetc 与流一起使用,以提供将检查 EOF 或 \r\n 序列的前瞻机制。
说了这么多,有谁知道我的大量代码和程序到底发生了什么?我在谷歌上搜索了一种方法来检查 FD 是否有关联的流,并且没有成功地找到/看到任何东西。我做了一些研究,看看是否有一些 fstat 时间函数可以让我看到相关的蒸汽并且什么都没有。我可以只复制传入函数 recv_line 的 FD,然后在复制的 FD 上 fdopen 并避免所有这些问题吗?
感谢所有帮助。如果我不够清楚,我很抱歉。如果您要求我这样做,我会尽力澄清任何事情。抱歉我的问题太长了。 =*(
再次感谢。非常感谢您的帮助。
【问题讨论】:
标签: c unix networking sockets