accept()返回到标准输出参考使用并行线程
原帖时,(1):accept()返回到标准输出参考使用并行线程
我一直在学习,从Beej指南网络编程学校网络编程。我目前正在为自己制作一个原型,通过使用线程和I/O多路复用同时在多个连接之间进行通信。我收到一个问题,当我收到一个连接并调用accept()返回一个新的文件描述符为“new_fd”而不是返回一个新的文件描述符时,它返回1.这对我来说没有意义,因为我是不在我的代码中的任何地方关闭标准输出,并且accept()应该返回对套接字的引用作为新的文件描述符,并且据我所知,线程在单个进程中共享相同的文件描述符,所以它不应该是个问题我有它的线程。我认为这个问题可能是我使用环回从我自己的计算机连接,但是当我通过引用我的IP地址或另一台计算机进行连接时,它也导致返回fd为1的错误。我不知道在哪里找了来解决这个问题
原帖代码: 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-}
经过很长时间后再次访问。 R ..指出的缺乏同步会是一个问题,但它不会导致我遇到的问题。这是简单地与接受逻辑小语法错误,所以我原本
if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1)
其书面计算并返回上接受new_fd布尔检查,这总是真正回归1的结果。我当时并没有意识到c会按照这种方式排列这些操作,并且我用圆括号固定它。
if ((new_fd = accept(listen_fd, (struct sockaddr*) &remoteHost), &addrelen)) != -1)
您的问题似乎是一个缺乏同步在chatDaemon
阅读*(int *)fd
的。 fd
是指向main
中的局部变量new_fd
的指针,可以在chatDaemon
正在读取它之前或在其调用chatDaemon
时调用未定义的行为。您需要为int
分配存储空间来存储fd并且让chatDaemon
免费,或者(优选)只需转换成即可将其转换为void *
,而不是试图通过引用传递fd。
呃,对不起,我没有抓到这个。不过,“壁”本来可以抓住它。 – 2015-01-08 16:56:00