请教一个C++ http的问题

David_359 2017-06-16 06:35:26
直接上代码了,C++做的后台,接收js的http数据:

#include "stdafx.h"
#include "WINSOCK2.H"
#include "stdio.h"
int _tmain(int argc, _TCHAR* argv[])
{
char sendBuf[100];
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);//获得sokect版本号
err=WSAStartup(wVersionRequested,&wsaData);//加载套接字库
if (0!=err)
{
return 0;
}
if (LOBYTE(wsaData.wVersion)!=1|| //判断当前的socket版本号是否是1.1
HIBYTE(wsaData.wVersion)!=1)
{
printf("error ver");
WSACleanup();
return 0;
}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建用于监听的套接字

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4111);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//绑定套接字
listen(sockSrv,5);//把套接字设置为监听模式 并准备客户请求

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char anser[]="HTTP/1.1 200 OK\r\n\r\n<html><head><title></title></head><body>\"msg\":成功,\"success\":true</body></html>\r\n";

while (1)
{
//等待客户请求的到来
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
//接收数据
char recvBuf[1024];
memset(recvBuf,0,1024);

recv(sockConn,recvBuf,1024,0);
printf("ServerRecvBuf:%s \r\n",recvBuf);
//发送
sprintf(sendBuf,"%s","hello");
printf("sendBuf:%s \r\n \r\n",sendBuf);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
//关闭套接字
closesocket(sockConn);
}
return 0;

}

前端js代码:
var pid = $('#pid').val();
var uid = $('#uid').val();
$.ajax({
url: "http://10.10.0.52:4111/workFlow/test?pid="+pid+"&uid="+uid,
type: 'GET',
dataType: 'JSONP',//here
success: function (data) {
console.log(data);
if(data.success){
location.href=msi.bp()+"/login";
}
else{
$.messager.show({
title:'提示',
msg:data.msg
});
}
}
});

现在的问题是,后台可以收到js发的pid,uid,前端data无返回数据,是咋回事啊??
...全文
222 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwqwqw408 2017-06-19
  • 打赏
  • 举报
回复
正如9楼所说,一次recv可能读不完的,需要多次调用。 Return value If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero. 一直读到返回值为0,或者出错。
David_359 2017-06-19
  • 打赏
  • 举报
回复
谢谢各位。。。
David_359 2017-06-18
  • 打赏
  • 举报
回复
引用 5 楼 qwqwqw408 的回复:
你回复的报文格式问题太多,连基本的content-type,content-length这些属性都没有,你这个思路是可以的,只不过格式有问题而已。 参考一下下面的格式 HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Encoding: UTF-8 Content-Length: 138 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Connection: close <html> <head> <title>An Example Page</title> </head> <body> Hello World, this is a very simple HTML document. </body> </html>
好的,也就是返回格式需要完善,谢谢,我尝试一下。
Van_Le 2017-06-18
  • 打赏
  • 举报
回复
引用 8 楼 weichuncai2012 的回复:
[quote=引用 6 楼 qwqwqw408 的回复:] 参考这个帖子: https://stackoverflow.com/questions/27102935/how-to-format-the-http-response Content-Length是必须要设置的。这个设置之后,应该至少能解析出来了。其他的头字段你再慢慢加
前端可以收到返回了,不过后台有时候一条recv数据不完整。是为什么?[/quote] tcp是数据流,recv的次数取决于数据缓冲区的大小,若一次未读完,则需recv进行多次
David_359 2017-06-18
  • 打赏
  • 举报
回复
引用 6 楼 qwqwqw408 的回复:
参考这个帖子: https://stackoverflow.com/questions/27102935/how-to-format-the-http-response Content-Length是必须要设置的。这个设置之后,应该至少能解析出来了。其他的头字段你再慢慢加
前端可以收到返回了,不过后台有时候一条recv数据不完整。是为什么?
qwqwqw408 2017-06-17
  • 打赏
  • 举报
回复
参考这个帖子: https://stackoverflow.com/questions/27102935/how-to-format-the-http-response Content-Length是必须要设置的。这个设置之后,应该至少能解析出来了。其他的头字段你再慢慢加
qwqwqw408 2017-06-17
  • 打赏
  • 举报
回复
你回复的报文格式问题太多,连基本的content-type,content-length这些属性都没有,你这个思路是可以的,只不过格式有问题而已。 参考一下下面的格式 HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Encoding: UTF-8 Content-Length: 138 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Connection: close <html> <head> <title>An Example Page</title> </head> <body> Hello World, this is a very simple HTML document. </body> </html>
David_359 2017-06-17
  • 打赏
  • 举报
回复
引用 2 楼 sdghchj 的回复:
前端js用的是http应用层协议,后端是tcp传输层协议,应用层高于传输层即前者建立在后者的基础之上,tcp能识别到http报文内容,但你发的tcp报文仅仅是一个简单的字符串,又不是http报文,前端解析不了。
我该怎么做?
David_359 2017-06-17
  • 打赏
  • 举报
回复
我后台改怎么做? 是不是需要使用websocekt
sdghchj 2017-06-16
  • 打赏
  • 举报
回复
前端js用的是http应用层协议,后端是tcp传输层协议,应用层高于传输层即前者建立在后者的基础之上,tcp能识别到http报文内容,但你发的tcp报文仅仅是一个简单的字符串,又不是http报文,前端解析不了。
David_359 2017-06-16
  • 打赏
  • 举报
回复

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧