c - 通过 TCP 客户端套接字接收数据时出现问题

标签 c sockets tcp

我正在尝试用 C 编写一个 TCP 客户端程序,客户端将在其中启动并连接到服务器。然后它会发送一些信息,然后只听它收到的内容并做出相应的 react 。

我遇到麻烦的部分是持续聆听。这是我的东西

...

while (1) {
   numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0);
   buf[numbytes] = '\0';
   printf("Received: %s\n", buf);
   // more code to react goes here
}

...

连接到服务器后,发送两行数据后,服务器应该会收到很多信息,但是当我运行它时,它会打印:

Received:

然后继续坐在那里直到我强制它关闭。

** 编辑 ** 当我按照乔纳森告诉我的去做时,我得到以下信息:

Count: -1, Error: 111, Received:

这意味着它出错了,但我该怎么办呢?

最佳答案

打印出接收到的字节数 - 可能为零,但请确认。

值得检查一下您是否没有收到错误 - 从而导致您的缓冲区下溢。

[注意:从这里开始是 Pax 的工作 - 谢谢,我已经将它转换为社区 Wiki,这样我就不会得到不当的代表点数。]

以下代码将执行此操作。请尝试并报告结果。

while (1) {
    numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0);
    buf[numbytes] = '\0';
    printf("Count: %d, Error: %d, Received: %s\n", numbytes, errno, buf);
    // more code to react goes here
}

问题编辑后:

错误编号 111 是 ECONNREFUSED - 这不是 recv() 的常见错误代码,但更适合于开放式调用(open()、connect() 等)。

无论如何,ECONNREFUSED 是服务器端的问题,而不是客户端的问题 - 服务器故意拒绝接受您的传入连接,因此您需要调查链接的那一端。

为了对此进行测试,请更改您的代码,使其连接到端口 80 上的 www.microsoft.com,然后发送几行旧垃圾。您应该从他们的 Web 服务器返回一个错误,指示格式错误的 HTTP 请求。这将证明您的客户端没有问题。

这是我在 telnet www.microsoft.com 80 并输入 hello 然后输入 ENTER 两次时得到的结果:

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Thu, 27 Nov 2008 01:45:09 GMT
Connection: close
Content-Length: 326

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Verb</h2>
<hr><p>HTTP Error 400. The request verb is invalid.</p>
</BODY></HTML>

您应该会看到类似的东西。

关于c - 通过 TCP 客户端套接字接收数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319576/

相关文章:

c - C中的字符串输入和输出

Java 防火墙检查?告诉服务器管理员关闭防火墙

C++ 套接字 - 服务器不接受多个客户端 (linux)

Bash Shell 脚本::实时发送 STD-OUT?

c - 两种不同方式的数组引用

c - 格式参数太多。 C eclipse

c - 将 char[] 添加到 char**(将字符串添加到字符串列表)

python - 在 python 中通过 SSL 反向 shell

c# 多线程应用程序中的 TCP 耗尽

java - 如何从普通 tcp 客户端响应 MessagingTemplate 的 sendAndReceive