gpt4 book ai didi

c - 重新创建套接字时绑定(bind)错误

转载 作者:太空狗 更新时间:2023-10-29 16:40:27 25 4
gpt4 key购买 nike

A 有以下监听器套接字:

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);
}
}

如果使用

close(sd);

然后尝试使用相同的代码重新创建套接字,发生绑定(bind)错误,并且仅在 30-60 秒后成功创建新套接字。

有没有办法以一些很酷的方式创建或关闭以避免绑定(bind)错误?

最佳答案

在内核的某个地方,仍然有一些关于您以前的套接字的信息。告诉内核您无论如何都愿意重新使用该端口:

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);
}

参见 the bind() section in beej's Guide to Network Programming以获得更详细的解释。

关于c - 重新创建套接字时绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5592747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com