2011-09-25 48 views
0

这是我第一次使用套接字,并且在接受服务器端的连接时遇到问题。我的服务器一次只能接受一个连接。一旦接收到连接,当前日期和时间将被写入套接字,然后客户端会打印出从服务器收到的日期和时间。我的服务器具有下面的代码:服务器使用accept()接受连接后的问题

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, 

谢谢。

+0

尝试运行下'strace'您的服务器绑定同一个端口在客户端和获取日志的接受 – bdonlan

+2

后会发生什么情况显示更多的服务器代码。 – cnicutar

+0

好吧,我用strace添加了运行服务器的输出。 'accept(3,'是最后一个要输出的东西,即使在与客户端连接之后。我正在debian上开发这个代码,但是当我尝试在我的mac上运行它时奇怪地工作正常,你有什么建议吗? – Max

回答

1

这不应该发生。

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

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

另一个实例正在运行,还是其他什么东西使用该端口号。请与netstat联系。为了上帝的缘故,请检查这些电话的返回值。

+0

我的问题是,当我开始制作服务器时,我通过ssh进行了这样的操作,并且我的连接一直在断开,这导致运行ps的服务器实例没有显示(必须执行ps -A)。 – Max

+0

检查'屏幕',它会让你的生活更轻松'ssh' –

1

您的bindEADDRINUSE一起失败,但您的服务器已打开。 将错误处理添加到您的代码中,并可能更改您正在使用的端口。

另外,我建议你确保你不被意外

+0

谢谢你这是正确的。我回答了上面的人回答,因为他先回答了,但有一个投票。 – Max