【发布时间】:2010-04-06 04:30:26
【问题描述】:
我现在是一名 C 编码员 - 既不是新手也不是专家。现在,我在 PPC Linux 上使用 C 语言有一个特定的守护程序应用程序。我使用 PHP 的 socket_connect 作为客户端在本地连接到该服务。服务器使用 epoll 通过 Unix 套接字多路复用连接。使用 strstr() 解析用户提交的字符串以查找某些字符/单词,如果找到,则同时生成 4 个可连接线程到不同的网站。我使用套接字、连接、写入和读取,通过 TCP 在每个线程的端口 80 上与所述网络服务器进行交互。所有连接和写入似乎都是成功的。然而,对网络服务器套接字的读取失败,其中一个 (A) 所有 3 个线程似乎都挂起,只有一个线程返回 -1 并且 errno 设置为 104。响应线程需要大约 10 分钟 - 一个永恒的时间:-(。*我在某处读到 104(是 EINTR?),在网络上下文中表明...'连接已被对等方重置';或(B)来自 3 个线程的 0 个字节,并且 4 个线程中只有 1 个实际上返回一些数据。套接字读/写不是线程安全的吗?我使用线程安全(和可重入)的 libc 函数,例如 strtok_r、gethostbyname_r 等。
*我怀疑上述虚拟主机实际上是在重置连接,因为当我运行单线程独立运行(其他所有条件相同)时,所有事情都运行良好,但当然是串联而不是并行。
还有第二个问题(哎呀),我无法回信给连接到我的 epoll-ed Unix 套接字的客户端。我的守护程序应用程序将永远挂起并占用 CPU > 100%。然而,没有任何东西写给客户端。确定客户端(一个非常典型的 PHP 套接字应用程序)在发生这种情况时没有关闭连接 - 也没有检测到错误。有什么想法吗?
即使使用 Valgrind、GDB 或大量日志记录,我也无法弄清楚有什么问题。请在力所能及的地方提供帮助。
【问题讨论】:
-
尝试在
strace下运行您的程序以获取有关正在发生的事情的更多信息。您也可以尝试使用 wireshark 来查看通过网络发送和接收的内容。 -
errno 104 是 ECONNRESET(由对等方重置连接),而不是 EINTR。
标签: sockets epoll multithreading eintr