Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 服务器使用accept()接受连接后出现问题_C++_Sockets - Fatal编程技术网

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
,它将使您的生活更轻松。谢谢您,这是正确的。我给了我上面的人答案,因为他首先回答了,但投了赞成票。