user-0 提问: 求解决方案：我用socket模拟http请求，访问天气预报公共websever服务器接口，结果运行返回“http/1.1 400 bad request”

回复:
user: user-1
content: 楼主这个可以获取到天气信息吗？？？

user: user-2
content: 逐字节对比你的代码和可用的例子程序的包内容有何不同之处。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:楼主学习使用抓包软件比如wireshark正当时！  那怎么用抓包软件检查它的错误的地方呢

user: user-2
content: 楼主学习使用抓包软件比如wireshark正当时！

user: user-0
content: 引用 2 楼 user-3 的回复: 大半夜的爬起来开电脑看了看，看图吧，睡觉去咯。。。 还有我这是用GET方式访问的，要是换成POST方式呢，这个问题解决了马上给分

user: user-0
content: 引用 3 楼 user-3 的回复:记得给分   太厉害了，问题解决了，可是为什么加几个换行符就行了呢？？

user: user-3
content: 引用 11楼我是你的主体 的回复:[quote=引用 10 楼 user-3 的回复:] [quote=引用 5楼我是你的主体 的回复:][quote=引用 2 楼 user-3 的回复:]  大半夜的爬起来开电脑看了看，看图吧，睡觉去咯。。。 还有我这是用GET方式访问的，要是换成POST方式呢，这个问题解决了马上给分  [/quote]Post请求的协议头比Get多了个，提交数据的大小。 如图所示，将lenght替换为"theC..."提交数据的长度。  然后协议头 + 空行 + 提交数据，这样应该就可以了。   HttpWatch会使？ 方法已经说了，就看楼主你的了[/quote] 真乃大神也！！按照http请求的格式有条理的顺了一遍，加上换行符后果然就好了，多谢啦！！[/quote]大神不敢当，不敢当

user: user-0
content: 引用 10 楼 user-3 的回复:[quote=引用 5楼我是你的主体 的回复:][quote=引用 2 楼 user-3 的回复:]  大半夜的爬起来开电脑看了看，看图吧，睡觉去咯。。。 还有我这是用GET方式访问的，要是换成POST方式呢，这个问题解决了马上给分  [/quote]Post请求的协议头比Get多了个，提交数据的大小。 如图所示，将lenght替换为"theC..."提交数据的长度。  然后协议头 + 空行 + 提交数据，这样应该就可以了。   HttpWatch会使？ 方法已经说了，就看楼主你的了[/quote] 真乃大神也！！按照http请求的格式有条理的顺了一遍，加上换行符后果然就好了，多谢啦！！

user: user-3
content: 引用 5楼我是你的主体 的回复:[quote=引用 2 楼 user-3 的回复:]  大半夜的爬起来开电脑看了看，看图吧，睡觉去咯。。。 还有我这是用GET方式访问的，要是换成POST方式呢，这个问题解决了马上给分  [/quote]Post请求的协议头比Get多了个，提交数据的大小。 如图所示，将lenght替换为"theC..."提交数据的长度。  然后协议头 + 空行 + 提交数据，这样应该就可以了。   HttpWatch会使？ 方法已经说了，就看楼主你的了

user: user-3
content: 记得给分

user: user-3
content: 大半夜的爬起来开电脑看了看，看图吧，睡觉去咯。。。

user: user-3
content: 引用 4楼我是你的主体 的回复:[quote=引用 3 楼 user-3 的回复:] 记得给分   太厉害了，问题解决了，可是为什么加几个换行符就行了呢？？[/quote]换行符多了，协议头错了。这是简单的错误。  HTTP请求的协议头，每行都应该有一个换行符。 然后协议头之后，一行空行，然后是提交的数据。Get可以没有数据，但是协议头后面与数据之间的空行一定要有。  你可以试一试，如果之间没有空行，程序会怎么样

user: user-0
content: 完整的程序代码如下： #include "stdio.h" #include "stdlib.h" #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) {    SOCKET hsocket;   SOCKADDR_IN saServer;   WSADATA     wsadata;   LPHOSTENT lphostent;   int     nRet;     char   Dest[3000];  char* host_name="www.webxml.com.cn"; char* req="GET /WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=57494 HTTP/1.1\r\n\r\n"//此为要发送的数据包  "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n"  "Accept-Language: zh-cn\r\n" "Connection: Keep-Alive\r\n" "Host: Host: www.webxml.com.cn\r\n" "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)"; // 初始化套接字      if(WSAStartup(MAKEWORD(2,2),&wsadata))         printf("初始化SOCKET出错！");     lphostent=gethostbyname(host_name);          if(lphostent==NULL)              printf("lphostent为空！");       hsocket   =   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);          saServer.sin_family = AF_INET;          saServer.sin_port = htons(80);          saServer.sin_addr =*((LPIN_ADDR)*lphostent->h_addr_list);       // 利用SOCKET连接       nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));          if(nRet == SOCKET_ERROR)          {         printf("建立连接时出错！");              closesocket(hsocket);         return 0;     }     // 利用SOCKET发送        nRet = send(hsocket,req,strlen(req),0);       if(nRet==SOCKET_ERROR)       {           printf("发送数据包时出错！");           closesocket(hsocket);       }           nRet=1;          while(nRet>0)          {           // 接收返回数据包           nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);              if(nRet>0)             Dest[nRet]=0;         else                  Dest[0]=0;           // 显示返回数据包的大小、内容          printf("\nReceived   bytes:%d\n",nRet);              printf("Result:\n%s",Dest);          } }