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;
}