我正在开发一个向另一个打开数据流 TCP 套接字的应用程序。 连接打开并被服务器接受后,我发送一条“登录”消息,服务器成功接收到该消息,服务器尝试发送“成功”消息。这就是事情变得奇怪的地方。
服务器写入失败,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" */
}
谢谢!
附言- 很抱歉在问题本身内回复评论,但我在创建帐户之前创建了问题,不允许我添加评论。
最佳答案
关于“Broken Pipe”,我猜你正试图在一个关闭的套接字中写一些东西,所以 SIG_PIPE 信号被释放,在这种情况下。声明<signal.h>
并以类似 signal(SIG_PIPE,SIG_IGN)
的方式安装信号操作
关于C - "Connection refused"在一个已经打开的套接字上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258364/