0

问题 :

我们能够与服务器成功通信,但无法发布消息。因为服务器响应了 "Your browser sent a request that this server could not understand"。当以下字符串的格式错误时,就会发生这种情况。

示例代码:

"POST /evs/getServerAddress?uid=abcd&pwd=abcd HTTP/1.1\r\n";
"Host: https://evs.idrive.com\r\n";
"Connection: Close\r\n\r\n";

//#include<sys/socket.h>
//sockfd is socket
//above three strings are passed as option_value1, option_value2 and option value3 
send(sockfd, option_value1, sizeof(option_value1), 1);
send(sockfd, option_value2, sizeof(option_value2), 1);
send(sockfd, option_value3, sizeof(option_value3), 1);

问题: 现在服务器没有响应任何东西。请让我知道几种从服务器获取响应的方法。

提前致谢

4

2 回答 2

2

您的代码在这里有几处问题。

  1. 正如 Remy LeBeau 所提到的,您为Host标头发送的值是错误的。它不应包含https://前缀。

  2. 同样如前所述,您应该发送这些字符串,其长度由 确定strlen(),而不是sizeof()。即使您采用字符数组(而不是指针)的大小,它仍然会导致一个字节太长。

  3. 的最后一个flags论点send()应该是0,不是1。将其设置为1( MSG_OOB) 会导致您的数据作为带外数据传输,这几乎不是您想要的。

  4. 您没有检查send(). 你真的应该 -send()可能并不总是发送请求的所有字节。

  5. 最重要的是:您的 POST 请求格式不正确。它不包含正文和Content-Length/ Content-Type。看起来好像您正在尝试在 URL 中传递 POST 变量,但这是您对 GET 请求所做的,而不是 POST。正确的 POST 请求如下所示:

    POST /evs/getServerAddress HTTP/1.1
    Host: evs.idrive.com
    Content-Type: multipart/x-www-form-urlencoded
    Content-Length: 17
    
    uid=abcd&pwd=abcd
    
于 2013-07-09T15:33:16.743 回答
0

在行

send(sockfd, option_value1, sizeof(option_value1), 1);

sizeof(option_value1)将评估为指针的大小。根据您的系统,这可能是也可能不是 4 个字节。因此,您只发送 4 个字节,或者无论您的系统指针大小是多少,字符串的字节数。

要获取字符串的长度,请使用strlen(option_value1).

您可以使用名为WireShark的程序检查您正在传输的内容。它是免费的,并且能够向您展示您的网络连接上发生了什么......您正在发送什么以及您正在接收什么。WireShark 还会告诉您您发送的 HTTP 数据包是否格式错误......

如果服务器没有响应您的程序,它是否响应 ping 请求。这是一个有用的工具。如果它正在响应 ping,那么您可以更加确信服务器正常,如果没有,那么您知道重新启动服务器。

于 2013-07-09T15:33:16.533 回答