【问题标题】:Linux: socket and binding issuesLinux:套接字和绑定问题
【发布时间】:2017-08-02 18:39:44
【问题描述】:

客户端函数close(socket)的返回值,服务端获取到哪个? 每次我从客户端关闭连接时,我的服务器也会关闭,当我尝试重新打开它时,我得到: bindind 套接字出错:Address Alreasy 正在使用中。

但是我在我的服务器中使用了这个功能:

n = read(newsockfd, buffer, sizeof(buffer));
if (n < 0) errore("Errore lettura Socket");
if (n == 0) 
                  { 
int true = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int));
shutdown(sockfd, SHUT_RDWR);
close(sockfd);

}

【问题讨论】:

  • 通常是服务器需要设置SO_REUSEADDR,而不是客户端。
  • 是的,这是来自服务器端的代码
  • setsockopt 调用应该在您创建套接字时进行 - 它不应该在您从客户端读取的位置附近
  • 您似乎要关闭 sockfd 而不是 newsockfd - 看起来这是一个错字而不是实际的错误?
  • @Emperon 在这种情况下,您需要调用setsockopt初始调用socket之前调用bind

标签: c sockets


【解决方案1】:

为了允许重新绑定到同一个地址,SO_REUSEADDR 选项必须在服务器套接字创建后启用,但之前调用 bind(),因为它是那个调用到bind,它实际上尝试将新创建的套接字附加到其预期的IP地址和端口,即

s = socket(...);
result = setsockopt(s, SO_REUSEADDR, ...);
result = bind(s, ...);

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多