【问题标题】:Problems after server uses accept() to accept connections服务器使用accept()接受连接后的问题
【发布时间】:2011-09-26 01:46:02
【问题描述】:

这是我第一次使用套接字,我在接受服务器端的连接时遇到了问题。我的服务器设计为一次只接受一个连接。一旦接收到连接,当前日期和时间将被写入套接字,然后客户端打印出它从服务器接收到的日期和时间。我的服务器有以下代码:

cout << "Server: Waiting for connections." << endl;
client_length = sizeof(client_address);
connection_fd = accept(listen_fd, (struct sockaddr*)&client_address, (socklen_t*)&client_length);
cout << "Server: Client connected" << endl;

当我运行我的服务器时,我得到以下输出:

./server&
Server: Waiting for connections.

然后当我运行我的客户端时,我得到以下输出:

./client 127.0.0.1
Client: Connecting to: 127.0.0.1
Client: Connected to server.
Sun Sep 25 13:20:07 2011

客户端似乎打印出正确的数据,但服务器从未打印出客户端已连接。这里不对劲。另一个症状是当我尝试写入管道(客户端写入,服务器读取)时,客户端收到一个损坏的管道错误。有什么我想念的吗?有什么想看的代码,欢迎询问。

编辑:这是在 strace 下运行的服务器。打印出接受后似乎没有任何反应。奇怪吗?

write(2, "Server: Socket created.", 23Server: Socket created.) = 23
write(2, "\n", 1
)                       = 1
bind(3, {sa_family=AF_INET, sin_port=htons(4007), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (Address already in use)
write(2, "Server: Address and port bound t"..., 41Server: Address and port bound to socket.) = 41
write(2, "\n", 1
)                       = 1
listen(3, 100)                          = 0
write(2, "Server: Socket is now a listenin"..., 41Server: Socket is now a listening socket.) = 41
write(2, "\n", 1
)                       = 1
write(2, "Server: Waiting for connections.", 32Server: Waiting for connections.) = 32
write(2, "\n", 1
)                       = 1
accept(3,  

谢谢。

【问题讨论】:

  • 尝试在strace 下运行您的服务器并记录接受后发生的情况
  • 好的,我添加了使用 strace 运行服务器的输出。 accept(3, 是最后输出的东西,即使在与客户端连接之后也是如此。我正在 debian 上开发此代码,但当我尝试在我的 mac 上运行它时,它却奇怪地工作正常。你有什么建议吗?

标签: c++ sockets


【解决方案1】:

这不应该发生。

甚至很难想象一个破碎的场景,比如你有两个服务器实例正在运行,另一个正在接受连接,但是新实例应该不能再次使用相同的端口号,所以您可能没有验证系统调用的返回值,但是接受应该失败,并且您应该看到错误的客户端连接消息。那么,您到底在做什么?

更新:是的...-1 EADDRINUSE (Address already in use)

另一个实例正在运行,或者其他使用该端口号的东西。请与netstat 联系。看在上帝的份上,检查这些调用的返回值。

【讨论】:

  • 非常感谢。我的问题是,当我开始创建服务器时,我是通过 ssh 进行的,并且我的连接不断下降。这留下了一个运行 ps 的服务器实例没有显示(必须执行 ps -A)。非常感谢您的帮助。
  • 检查screen,它会让你的生活比ssh更轻松。
【解决方案2】:

您的bindEADDRINUSE 一起失败,但您的服务器仍在运行。 为您的代码添加错误处理,并可能更改您正在使用的端口。

另外,我建议你确保你不是偶然在客户端绑定了同一个端口

【讨论】:

  • 谢谢你这是正确的。我把答案给了我上面的那个人,因为他先回答了,但是投了赞成票。
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多