【问题标题】:Connect function fails every now and then?连接功能时不时失败?
【发布时间】:2013-12-02 13:22:19
【问题描述】:

我正在使用连接功能 (http://linux.die.net/man/2/connect),它只在某些时候有效。以前一直能正常工作,现在基本没用了。自从我大约 2 周前第一次编写代码以来,代码没有改变,所以结果不应该改变。我认为这与我的网络有关。我正在使用端口 5301(几乎是随机选择的)所以也许有某种阻塞发生了?我使用的是本地 IP 127.0.0.1。

服务器代码:

    int connectionID = 0, listenID = 0;                         
    struct sockaddr_in sad;
    listenID = socket (AF_INET, SOCK_STREAM, 0);                         
    memset (&sad, 0, sizeof(sad));          
    sad.sin_family = AF_INET;                                
    sad.sin_addr.s_addr = INADDR_ANY;                       
    sad.sin_port = htons(5301);    
    bind (listenID, (struct sockaddr *)&sad, sizeof(sad));

客户端代码:

    int sockID = 0;     
    struct sockaddr_in sad;
    sockID = socket (AF_INET, SOCK_STREAM, 0); 
    sad.sin_family = AF_INET; 
    sad.sin_port = htons(5301);
    inet_pton (AF_INET, serverIP, &sad.sin_addr.s_addr);
    if (connect (sockID, (struct sockaddr *)&sad, sizeof(sad)) < 0)
    {
         printf ("Error Connecting to Server\n");
         return;
    }

IP作为参数传入

【问题讨论】:

  • 未创建连接时出现什么错误?这可能会为这个主题指明一些方向。 :)
  • 连接被拒绝是 errno 吐出来的。它是随机的,它只是连续工作了两次。但之前 50 次尝试中没有一次。

标签: c sockets


【解决方案1】:

很难准确判断问题出在哪里,但如果客户端突然报告“连接被拒绝”,那么很可能服务器不再监听。

服务器应检查来自bind 的返回值是否有任何错误,以确定它是否因任何原因无法绑定到端口5301。您在此处发布的服务器代码不会检查可能出现的任何错误。

【讨论】:

  • 是的,它没有约束力。 Errno 说地址已在使用中。您应该如何正确关闭连接?
  • @user2929779 Stack Overflow 上有很多问题讨论如何解决“地址已在使用中”。一些见stackoverflow.com/questions/1592055/bind-address-already-in-use。我还推荐 W. Richard Stevens 的书 Unix Network Programming 以全面解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2015-07-05
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多