我正在尝试用 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/