WWwicky 2019-03-24 11:06 采纳率: 0%
浏览 561
已结题

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

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

这是运行结果
图片说明

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

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

  • 写回答

2条回答 默认 最新

  • dabocaiqq 2019-03-25 10:13
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能