0

原帖:

我一直在从 Beej 的学校网络编程指南学习网络编程。我目前正在为自己开发一个原型,以通过使用线程和 I/O 多路复用在多个连接之间同时进行通信。我遇到了一个问题,当我收到连接并调用 accept() 以将新文件描述符返回到“new_fd”而不是返回新文件描述符时,它返回 1。这对我来说没有意义,因为我在我的代码中不关闭 stdout 并且 accept() 应该返回对套接字的引用作为新的文件描述符,据我所知,线程在单个进程中共享相同的文件描述符,所以它不应该是一个问题我把它穿好了。我认为问题可能是我使用环回从自己的计算机连接,

原始发布代码: http: //pastebin.com/APQYjxg9 (我已经发布了所有代码)

为了清楚起见,对此进行编辑。我的代码有两个问题。R.. 立即指出了第一个,代码片段在这里:

if (value = pthread_create((chat+chat_count), NULL, chatDaemon, (void *) &new_fd) != 0) 
{ -snip- }

void * chatDaemon(void * fd) 
{
    int my_fd = *((int *)fd);
    -snip-
}

后来我弄清楚出了什么问题并发布了我的答案。这里的代码片段:

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1) { -snip-}
4

2 回答 2

2

太久之后重温这个。R.. 指出的缺乏同步将是一个问题,但这并没有导致我遇到的问题。这只是接受逻辑的一个小语法错误,所以我最初有

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1)

正如所写的那样,它评估并将接受布尔检查的结果返回给 new_fd,new_fd 总是返回 1 表示真。当时我没有意识到 c 会以这种方式对操作进行排序,因此我用括号对其进行了修复。

if ((new_fd = accept(listen_fd, (struct sockaddr*) &remoteHost), &addrelen)) != -1)
于 2015-01-08T15:49:54.950 回答
1

您的问题似乎是缺乏同步读取*(int *)fd。是指向局部变量in的指针,可以在读取它之前或读取它时对其进行修改,从而调用未定义的行为。您要么需要为存储 fd 分配存储空间并释放它,要么(最好)只是其强制转换,而不是尝试通过引用传递 fd。chatDaemonfdnew_fdmainchatDaemonintchatDaemonvoid *

于 2014-11-07T03:24:42.343 回答