2011-08-31 105 views
2

我正在开发一个将数据流TCP套接字打开到另一个套接字的应用程序。 连接打开并被服务器接受后,我发送一个“登录”消息,服务器成功接收到该消息,服务器尝试发送“成功”消息。这是奇怪的地方。C - 在已打开的套接字上“拒绝连接”

服务器上的写入失败,并将errno设置为“Broken pipe”。 客户机轮询文件描述符,等待数据读取,也会失败。在此errno被设置为“连接被拒绝”。

环回设备上的所有连接均为TCP。 使用tcpdump,我可以看到FIN从客户端发送到服务器。 可以发现here

如果连接已建立,errno如何成为“连接被拒绝”? 什么可能导致此行为?客户端代码是同步的,没有任何线程,也没有其他人可以访问文件描述符。

如果重要,服务器是Asterisk管理器。客户端代码的

片段(真正的代码有错误检查,分离功能,这样):

struct sockaddr_in sa; 
int fd; 

fd = sock_socket(SOCK_STREAM, 0, 0);. 
MZERO(sa); 
sa.sin_family = AF_INET; 
sa.sin_addr.s_addr = inet_addr("127.0.0.1"); 
sa.sin_port = htons(MANAGER_PORT); 

connect(fd, (struct sockaddr *)&sa, sizeof(sa)); 
sprintf(buf, 
    "Action: Login\r\n" 
    "Username: %s\r\n" 
    "Secret: %s\r\n" 
    "Events: %s\r\n" 
    "ActionID: %d\r\n" 
    "\r\n", 
    MANAGER_USERNAME, MANAGER_PASSWORD, events, manager_action_id++) 

write(fd, buf, strlen(buf)); 

{ 
    struct pollfd fds = {fd, POLLIN, 0}; 

    if (poll(&fds, 1, timeout) <= 0) 
     return -1; /* This is where the client fails with "Connection refused" */ 
} 

谢谢!

P.S. - 抱歉对问题内部的评论作出回应,但是我在创建帐户之前创建了问题,并且我不允许添加评论。

+4

您需要向我们展示您的客户端源代码。 –

+0

你确定没有人调用'close'或'shutdown'吗?你能告诉我们捕获文件吗? – cnicutar

+0

'poll'不应该以errno'ECONNREFUSED'返回-1。它可能已经返回0,在这种情况下,errno没有设置;它只是从以前的系统调用中遗留下来。尝试在'strace'下运行客户端以确保调用和错误的顺序正确。 – mark4o

回答

0

关于以“水管坏了”,我猜你是尝试写一些东西,在一个封闭的插座所以SIG_PIPE信号释放,在这case.Declare <signal.h>和的方式安装信号操作,如signal(SIG_PIPE,SIG_IGN)