2014-11-07 60 views
-1

原帖时,(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-} 

回答

2

经过很长时间后再次访问。 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) 
+0

呃,对不起,我没有抓到这个。不过,“壁”本来可以抓住它。 – 2015-01-08 16:56:00

1

您的问题似乎是一个缺乏同步在chatDaemon阅读*(int *)fd的。 fd是指向main中的局部变量new_fd的指针,可以在chatDaemon正在读取它之前或在其调用chatDaemon时调用未定义的行为。您需要为int分配存储空间来存储fd并且让chatDaemon免费,或者(优选)只需转换成即可将其转换为void *,而不是试图通过引用传递fd。

+0

我敢肯定的标准并不能保证的sizeof(无效*)> =的sizeof(int)的,这样会太不确定 – Voo 2014-11-07 06:36:18

+0

@Voo:没有,只是实现定义。如果你愿意,有一些技巧可以使它完全便携,但需要付出一些代价。 – 2014-11-07 14:10:03

+0

由于一个整数大于指针的实现在理论上是可行的,我想,你会怎么做呢?有趣的问题。 – Voo 2014-11-07 17:58:24