通过C++/java socket向服务器端传递字符串并接收服务器的反馈字符串与使用浏览器实现相同功能有何区别? 80C

1.在写一个打开网络服务的软件的接口时(win10环境),用c++和java 的socket分别写了两个客户端,客户端的功能是通过端口8081向本地服务器localhost发送字符串“?scanX”,然后接收服务器的反馈“done!",但是在接收的过程中会出现网络中断,要写接口的软件报错;但如果用浏览器,直接在地址栏输入"http://127.0.0.1:8081/?scanB" ,浏览器会直接显示"done!".我想解决的是用c++写一个接口exe能及时向服务器传递字符串并接收反馈,但此时反馈出现了问题,本人小白,问了很多前辈也未能解决疑问,在此求教各位前辈,大佬。

2.以下为c++代码段,运行到"sended request success!"后网络服务器不知为何断开,要写接口的软件报错

#include <iostream>
#include <windows.h>
using namespace std;
 //在windows网络编程中需要引入库
#pragma  comment(lib, "wsock32.lib")

int main(int argc, char *argv[]) 
{
//在windows网络编程中导入库,linux中不需要
WSADATA Ws;
if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
{
    cout << "Init Windows Socket Failed::" << GetLastError() << endl;
    return -1;
}

//通过域名获取IP地址
HOSTENT *host_entry = gethostbyname("127.0.0.1");
if (!host_entry){ return -1; }

//将网络字节序的网络地址转为本地字节序
char *serverIP = inet_ntoa(*((struct in_addr *)host_entry->h_addr));
cout << "server IP is " << serverIP << endl;


//创建socket并且绑定了TCP协议
int hsocket = socket(AF_INET, SOCK_STREAM, 0);

//socket创建失败,一般都是系统资源没有了,或者没有权限
if (hsocket == INVALID_SOCKET)

{
    cout << "Create Socket Failed::" << GetLastError() << endl;
    return -2;
}

//连接http服务器
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8081); //指定端口号
servAddr.sin_addr.S_un.S_addr = inet_addr(serverIP);
if (connect(hsocket, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1)
{
    cout << "Connect error" << endl;
    return -3;
}
else cout << "Connected "<<serverIP<<" successed!" << endl;


//发出页面URL请求数据
char req[] = "?connect0";
//注意send并不能保证你指定大小的数据它能够全部发送,
if (send(hsocket, req, (int)strlen(req), 0) < 0)
{
    cout << "send request error" << endl;
    return -4;
}

cout << "sended request success!" << endl;

//接收数据的缓冲,应为是字符串所以结尾要加\0,我们一开始就将它全部置0
char buffer[10000] = {0};
int len;
if ( recv(hsocket, buffer, sizeof(buffer)-1, 0) <0)
{
    cout << "read error" << endl;
    exit(1);
}
cout << buffer << endl;
getchar();
return 0;
}

这是运行结果
图片说明

软件报错(查百度说这句话是因为读取软件数据导致的,不知正确与否)
图片说明

对比使用浏览器通信,能直接收到反馈
图片说明

c++

2个回答

如果你用http标准的协议,那么毫无区别。因为浏览器、操作系统也是用socket这么通讯的,而且也很可能是c++写的。

qq_43679439
WWwicky 那是否可能是我写的socket用的是TCP,而浏览器走的是http,这个会有区别吗?
8 个月之前 回复

你这样写要是能有回复就神奇了
因为:你的代码是走TCP协议,而浏览器是走Http协议,你这样send过去,http服务器识别出来你用的不是http协议,直接给你关闭连接
http是TCP层上面又封装了一层(请百度),如果你要用TCP协议的send和recv去模拟,那你要把http头和http握手也一起模拟才行
如果是windows,你可以用wininet提供的http封装函数(HttpConnection/request...)
如果是Linux,那库更多
总之,你要先搞清楚TCP和HTTP的区别

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!