【问题标题】:Problem with Closing Sockets. Program Halts关闭套接字的问题。程序暂停
【发布时间】:2010-10-01 03:37:42
【问题描述】:

我在使用 this code 时遇到了一些问题。问题是当我请求服务器向我发送一些数据并且客户端只是在服务器尝试向我发送数据时断开连接,应用程序存在。

这是我认为导致问题的行

int SendBinary(int *byte, int length)
{
    int bytes_sent;

    bytes_sent = send(connecting_socket, byte, length, 0);

    return bytes_sent;


    return 0;
}

void SendFile(FILE *fp, int file_size)
{
    int current_char = 0;

    do{
        current_char = fgetc(fp);

        if ( current_char == EOF )
            break;

        SendBinary(&current_char, sizeof(char));
    }
    while(current_char != EOF);

}

任何想法我应该做些什么来防止这种情况?修改整个源代码以补充这个 sn-p。

【问题讨论】:

  • 这里没有太多信息可以继续。服务器如何退出?如果是segfault,你有没有使用调试器来确定故障发生在哪里?
  • 不,这不是 segfault ,只是在没有任何消息的情况下终止。
  • 你不应该使用 sizeof (char)。它被定义为1,所以它只会给代码增加混乱。此外,您的代码可能已损坏,因为它会将 char 读入 int,然后将指向该 int 的指针传递给期望指向字节的指针的函数 (send())。
  • send 需要一个 void*。并且 sizeof(char) 取决于系统。确定在这种情况下它是 Unix,它是 1。但这是一个很好的做法。

标签: c sockets unix


【解决方案1】:

也许您的应用程序在写入/发送期间接收到 SIGPIPE 而没有忽略它?尝试忽略此信号或为其安装无操作处理程序。

【讨论】:

  • 喜欢这个?信号(SIGPIPE,SIG_IGN);
  • 像魅力一样工作。如何真正处理 SIGPIPE?
  • 几乎每个程序都会忽略 SIGPIPE。通过正确检查返回的错误代码,您将知道 write() 或 send() 失败时发生的情况。
  • 检测与此类内容相关的错误和崩溃的好方法是在您的程序上运行 strace。我数不清有多少次 strace 救了我的命。
【解决方案2】:

您确定客户端从服务器接收数据没有失败?

  1. telnet到你的服务器看看 它发送的响应是什么

  2. 将您的服务器替换为 netcat 确保客户是 行为正确

  3. 嗅探服务器和服务器之间的流量 使用tcpdump 或类似的客户端 工具

【讨论】:

  • 客户端是 Chrome 和 IE,因为它是一个网络服务器。在 Chrome 的情况下,它应该表现良好,但你永远不知道 IE ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2010-09-15
相关资源
最近更新 更多