无法绑定套接字

时间:2015-08-08 23:54:41

标签: sockets

我一直在写服务器,每次我退出并重新打开它,似乎都无法绑定到套接字。在关闭服务器之前,我连接了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));

2 个答案:

答案 0 :(得分:2)

您需要设置SO_REUSEADDR选项。否则,一旦你在一个进程中获取端口,在内核再次让你拥有它之前会有一个重要的超时。在an existing question中可以找到很多细节;我已经投票决定以副本结束。

答案 1 :(得分:0)

我也遇到了类似的问题,这是由端口上的另一个进程引起的。终止该进程即可解决问题。