C++ 服务器使用accept()接受连接后出现问题
这是我第一次使用套接字,在服务器端接受连接时遇到了问题。我的服务器设计为一次只接受一个连接。一旦收到连接,当前日期和时间将写入套接字,然后客户端打印出从服务器收到的日期和时间。我的服务器具有以下代码:C++ 服务器使用accept()接受连接后出现问题,c++,sockets,C++,Sockets,这是我第一次使用套接字,在服务器端接受连接时遇到了问题。我的服务器设计为一次只接受一个连接。一旦收到连接,当前日期和时间将写入套接字,然后客户端打印出从服务器收到的日期和时间。我的服务器具有以下代码: cout << "Server: Waiting for connections." << endl; client_length = sizeof(client_address); connection_fd = accept(listen_fd, (struct soc
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下运行的服务器。打印出accept后,似乎什么也没有发生。奇怪
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,
谢谢。这不应该发生
甚至很难想象一个中断的场景,比如您有两个服务器实例正在运行,另一个正在接受连接,但是新实例应该不能再次使用相同的端口号,因此您可能不会验证系统调用的返回值,但是accept应该失败,您应该会看到一条错误的客户端连接消息。。那么,你到底在干什么
更新:是的<代码>-1 EADDRINUSE(地址已在使用)
另一个实例正在运行,或者其他使用该端口号的实例正在运行。使用
netstat
进行检查。看在上帝的份上,检查这些调用的返回值。您的bind
在EADDRINUSE
中失败,但您的服务器仍在运行。
在代码中添加错误处理,并可能更改正在使用的端口
此外,我建议您确保没有意外地绑定客户端中的同一端口尝试在
strace
下运行服务器,并获取acceptOk后发生的情况的日志我添加了使用strace运行服务器的输出<代码>接受(3,是最后一个要输出的东西,即使在连接客户端之后也是如此。我正在debian上开发这段代码,但是当我尝试在mac上运行它时,它运行得很好。你有什么建议吗?非常感谢。我的问题是,当我开始制作服务器时,我是通过ssh这样做的,我的连接不断断开。这留下了一个错误运行ps未显示的服务器的实例(必须执行ps-A)。非常感谢您的帮助。检查屏幕,通过ssh
,它将使您的生活更轻松。谢谢您,这是正确的。我给了我上面的人答案,因为他首先回答了,但投了赞成票。