这是我第一次使用套接字,我在接受服务器端的连接时遇到问题。我的服务器只能一次接受一个连接。收到连接后,将当前日期和时间写入套接字,然后客户端打印出从服务器收到的日期和时间。我的服务器有以下代码:
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 :(得分:1)
这不应该发生。
甚至很难想象一个破碎的场景,比如你有两个服务器运行实例,另一个是接受连接,但是新实例不应该再次使用相同的端口号,所以你可能没有验证系统调用的返回值,但是接受应该失败,你应该看到一个错误的客户端连接消息..所以,你到底在做什么?
更新:yepp ... -1 EADDRINUSE (Address already in use)
正在运行另一个实例,或使用该端口号的其他实例。查看netstat
。为了上帝的缘故,检查这些电话的返回值。
答案 1 :(得分:1)
您的bind
因EADDRINUSE
失败,但您的服务器仍处于启动状态。
为代码添加错误处理,并可能更改您正在使用的端口。
另外,我建议你确保你没有意外绑定客户端中的同一个端口