问题:
我们能够成功与服务器通信但无法通信
发布消息。因为服务器响应了
"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);
问题: 现在服务器没有响应任何东西。请告诉我从服务器获取响应的几种方法。
提前致谢
答案 0 :(得分:2)
这里的代码存在一些问题。
正如Remy LeBeau所提到的,您为Host
标头发送的值是错误的。它不应包含https://
前缀。
同样如上所述,您应该发送这些字符串,其长度由strlen()
确定,而不是sizeof()
。即使您正在使用字符数组(不是指针)的大小,这仍然会导致字节太长。
flags
的最终send()
参数应为0
,而非1
。将其设置为1
(MSG_OOB
)会导致您的数据作为带外数据传输,这几乎不是您想要的。
您没有检查send()
的返回值。你真的应该 - send()
可能并不总是发送所有请求的字节。
最重要的是:您的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
答案 1 :(得分:0)
在第
行send(sockfd, option_value1, sizeof(option_value1), 1);
sizeof(option_value1)
将评估指针的大小。根据您的系统,这可能是也可能不是4个字节。因此,您只发送4,或系统的指针大小,字符串的字节。
要获取字符串的长度,请使用strlen(option_value1)
。
您可以使用程序调用{{3}}来检查您要传输的内容。它是免费的,并且能够向您显示您的网络连接正在发生什么...您正在发送什么以及您正在接收什么。 WireShark还会告诉您发送的HTTP数据包是否格式错误......
如果服务器没有响应您的程序,它是否响应ping请求。这是一个有用的工具。如果它响应ping,那么你可以更自信服务器是否正常,如果没有,那么你知道重启服务器。