【问题标题】:TCP Socket Implementation always gives old valueTCP 套接字实现总是给出旧值
【发布时间】:2015-08-20 07:52:13
【问题描述】:

目前在 C 中实现 TCP 套接字。使用 libcurl 我正在发送带有一些 XML 文件的 HTTP POST 请求。连接和传输工作正常。

现在,当我尝试在同一个会话中向服务器发送 2 个不同的 XML 文件时,我总是得到我发送的第一个传输的值。这意味着我总是得到旧值,套接字不会返回套接字上收到的新值。

Wireshark 向我展示了传输不同的 XML 文件。在建立每个 TCP 连接后,我是否需要以某种方式清理套接字?

这是我的服务器实现:

while (1) {
    char buf[512];

    connfd = accept(listenfd, (struct sockaddr*) NULL, NULL);
    if (connfd == -1) {
        perror("accept");
        continue;
    }

    int rec;
    rec = recv(connfd, buf, sizeof (buf), 0);
    printf ("Receive val: %d\n", rec);

    //DO STUFF

    //Send back ACK
    strcpy(sendBuff, "Received");
    write(connfd, sendBuff, strlen(sendBuff));

    close(connfd);
    sleep(1);
}

【问题讨论】:

  • 说到“旧值”,是说buf的内容还是rec的内容?
  • 我指的是rec.的内容

标签: c sockets tcp


【解决方案1】:

在收到第一个数据包后立即关闭会话。这就是你没有收到下一个数据包的原因。

您应该在单独的线程中处理每个传入连接,或者在关闭套接字之前以某种方式确保不再有传入数据到达

【讨论】:

  • 是的,它应该是两个独立的连接,比如来自两个不同的客户端。我是否需要使用线程然后以这种方式实现它?
  • 这就是通常的做法。每个连接都在一个单独的线程中处理。
  • 实际上,如果数据将从两个单独的连接发送,那么您的问题就不会出现。而且由于您在获得信息后立即关闭连接,因此您将能够与多个客户合作,并且不会感到很大的延迟。尽管如此,线程更好,因为它们允许真正的并行性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2021-10-21
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多