套接字程序无法POST - C(Linux)

时间:2013-07-09 15:07:05

标签: c linux sockets post

问题:

我们能够成功与服务器通信但无法通信  发布消息。因为服务器响应了 "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);

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

提前致谢

2 个答案:

答案 0 :(得分:2)

这里的代码存在一些问题。

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

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

  3. flags的最终send()参数应为0,而非1。将其设置为1MSG_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
    

答案 1 :(得分:0)

在第

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

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

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

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

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