Bind error while recreating socket
bind, c, sockets
Solution
Somewhere in the kernel, there's still some information about your previous socket hanging around. Tell the kernel that you are willing to re-use the port anyway:
int yes=1;
//char yes='1'; // use this under Solaris
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) {
perror("setsockopt");
exit(1);
}
See the bind() section in beej's Guide to Network Programming for a more detailed explanation.
Problem
A have the following listener socket: ``` int sd = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(http_port); addr.sin_addr.s_addr = INADDR_ANY; if(bind(sd,(sockaddr*)&addr,sizeof(addr))!=0) { ... } if (listen(sd, 16)!=0) { ... } int sent = 0; for(;;) { int client = accept(sd, (sockaddr*)&addr, (socklen_t*)&size); if (client > 0) { ... close(client); } } ``` If a use ``` close(sd); ``` and then trying to recreate socket with the same code, a bind error happens, and only after 30-60 second a new socket is created successfully. It there a way to create or close in some cool way to avoid bind error?