c++做socket客户端,java做socket服务器的问题

Q446512799 2019-04-03 05:01:26
现在使用c++写的socket客户端通信
java代码写的socket服务端

现在是Java服务端收到了c++客户端的消息,且做了返回,但c++客户端接收一直失败
同样用c++写的socket服务端,客户端是能正常接收的

c++代码如下:

const int BUF_SIZE = 10240;

int nNetTimeout = 1000;//1秒

WSADATA wsd; //WSADATA变量
SOCKET sHost; //服务器套接字
SOCKADDR_IN servAddr; //服务器地址
char buf[BUF_SIZE]; //接收数据缓冲区
static char bufRecv[BUF_SIZE];
char log[1024 + 1];

char ip[32 + 1];

cout << (char*)info.c_str() << endl;

char *sendbuf = (char*)info.c_str();
string recvbuf;

int retVal; //返回值
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
cout << "WSAStartup failed!" << endl;
return recvbuf;
}

//创建套接字
sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sHost)
{
cout << "socket failed!" << endl;
WSACleanup();//释放套接字资源
return recvbuf;
}
//发送时限
setsockopt(sHost, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
//接收时限
setsockopt(sHost, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));

char hostname[256];
gethostname(hostname, sizeof(hostname));
HOSTENT* host = gethostbyname(hostname);
strcpy_s(ip, inet_ntoa(*(in_addr*)*host->h_addr_list));

//设置服务器地址
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(ip);
servAddr.sin_port = htons((short)8000);
int nServAddlen = sizeof(servAddr);

//连接服务器
retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
if (SOCKET_ERROR == retVal)
{
cout << "connect failed!" << endl;
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
recvbuf = "conn err";
return recvbuf;
}
cout << "connect ok!" << endl;
//向服务器发送数据
ZeroMemory(buf, BUF_SIZE);

cout << "send msg is:" << sendbuf << endl;
retVal = send(sHost, sendbuf, strlen(sendbuf), 0);
if (SOCKET_ERROR == retVal)
{
cout << "send failed!" << endl;
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
recvbuf = "send err";
return recvbuf;
}

cout << "send ok!" << endl;

ZeroMemory(bufRecv, BUF_SIZE);

retVal = recv(sHost, bufRecv, BUF_SIZE, 0);
if (retVal < 0)
{
cout << "recv err" << endl;
}
//退出
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
recvbuf = bufRecv;

cout << "recv msg is " << bufRecv << endl;

return recvbuf;


java服务端代码:

ServerSocket serversocket = new ServerSocket(8000);
System.out.println("listen 8000");
Socket socket = serversocket.accept();
System.out.println("have client connect");
InputStream inp = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(inp);
BufferedReader bfr = new BufferedReader(isr);

String info = null;
while ((info = bfr.readLine())!=null) {
System.out.println("recv msg is:"+info);
}
socket.shutdownInput();

OutputStream ots = socket.getOutputStream();
PrintWriter pw = new PrintWriter(ots);
pw.write("ni hao ya!!!!!");
pw.flush();

System.out.println("have send client msg");

pw.close();
ots.close();
bfr.close();
isr.close();
inp.close();
socket.close();
serversocket.close();
...全文
149 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dan淡淡的心 2019-04-04
  • 打赏
  • 举报
回复
上方java server代码无误的话 在断开连接之前是不会有null值的 按理说是不会反悔数据的
Q446512799 2019-04-04
  • 打赏
  • 举报
回复
引用 2 楼 LCL_data 的回复:
是java端没发出消息吗?

java端也发消息了
都测试了java客户端和java服务端正常通讯
c++客户端与c++服务端正常通讯
就是c++客户端发给java服务端,java服务端看日志能接收能反馈,c++这边一直recv失败
十八道胡同 2019-04-03
  • 打赏
  • 举报
回复
是java端没发出消息吗?
十八道胡同 2019-04-03
  • 打赏
  • 举报
回复
C++ 接收失败的,在C++程序中多加些日志,看下输出的日志 是不是按照我们的思路输出的

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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