我一直在写服务器,每次我退出并重新打开它,似乎都无法绑定到套接字。在关闭服务器之前,我连接了2个客户端,然后用close()
断开连接,然后在打开服务器之前退出客户端以防万一,但它似乎仍然失败,我必须重新启动我的电脑。这是我的代码:
listenSocket = device = app = 0;
struct sockaddr_in server_addr;
char buffer[1024];
listenSocket = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_addr, '0', sizeof(server_addr));
memset(buffer, '0', sizeof(buffer));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(35565);
//bind the socket
if (bind(listenSocket,(struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
NSLog(@"Error binding to socket");
}
if (listen(listenSocket, 5) == -1) {
NSLog(@"Failed to listen");
}
//launch thread for console
[NSThread detachNewThreadSelector:@selector(console) toTarget:self withObject:nil];
NSLog(@"Starting server");
//socket open, ask for clients
while (true) {
int client = -1;
if (!device || !app)
client = accept(listenSocket, (struct sockaddr*)NULL, NULL);
//handshake omitted for length
}
关闭服务器的代码:
close(listenSocket);
close(device);
close(app);
NSLog(@"Clean");
我做错了吗?任何帮助,将不胜感激。感谢。
编辑:这是我的错误检查代码:
NSLog(@"%s",strerror(errno));
int e = bind(listenSocket,(struct sockaddr*)&server_addr, sizeof(server_addr));
NSLog(@"%s",strerror(errno));
答案 0 :(得分:2)
您需要设置SO_REUSEADDR
选项。否则,一旦你在一个进程中获取端口,在内核再次让你拥有它之前会有一个重要的超时。在an existing question中可以找到很多细节;我已经投票决定以副本结束。
答案 1 :(得分:0)
我也遇到了类似的问题,这是由端口上的另一个进程引起的。终止该进程即可解决问题。