UDP多线程传输,为什么客户端向服务器发送数据,能收到;服务器向客户端发数据却不能收到?

问题描述

//客户端#include"stdafx.h"#include<winsock2.h>#include<iostream>#include<cstdlib>#pragmacomment(lib,"WS2_32")//链接到WS2_32.lib#defineBUFFERLEN256usingnamespacestd;classCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmajorVer=2){//初始化WS2_32.dllWSADATAwsaData;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(::WSAStartup(sockVersion,&wsaData)!=0){exit(0);}}~CInitSock(){::WSACleanup();}};DWORDWINAPISendProc(LPVOIDlparam);DWORDWINAPIRecvProc(LPVOIDlparam);DWORDWINAPIListenProc(LPVOIDlparam);HANDLEh[2]={0};sockaddr_into={0};inttoLen=sizeof(to);intmain(){CInitSockclientInit;SOCKETsClientSocket=socket(AF_INET,SOCK_DGRAM,0);to.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");to.sin_family=AF_INET;to.sin_port=htons(8080);HANDLEh[2];h[0]=CreateThread(NULL,0,SendProc,(LPVOID)sClientSocket,0,NULL);h[1]=CreateThread(NULL,0,RecvProc,(LPVOID)sClientSocket,0,NULL);WaitForMultipleObjects(1,h,TRUE,INFINITE);closesocket(sClientSocket);system("pause");return0;}DWORDWINAPISendProc(LPVOIDlparam){charsendBuffer[BUFFERLEN];charrecvBuffer[BUFFERLEN];SOCKETs=SOCKET(lparam);memset(sendBuffer,0,BUFFERLEN);memset(recvBuffer,0,BUFFERLEN);while(1){cin>>sendBuffer;intret=sendto(s,sendBuffer,strlen(sendBuffer),0,(constsockaddr*)&to,toLen);recvfrom(s,recvBuffer,BUFFERLEN,0,(sockaddr*)&to,&toLen);if(ret<=0)break;if(strcmp(sendBuffer,"quit")==0)break;}return0;}DWORDWINAPIRecvProc(LPVOIDlparam){SOCKETs=(SOCKET)lparam;sockaddr_inlocal;charrecvBuffer[BUFFERLEN];intlen=sizeof(local);while(1){getsockname(s,(sockaddr*)&local,&len);if(local.sin_port==0){Sleep(1000);continue;}ZeroMemory(recvBuffer,BUFFERLEN);intret=recvfrom(s,recvBuffer,BUFFERLEN,0,(sockaddr*)&to,&toLen);if(ret<=0)break;cout<<"from"<<inet_ntoa(to.sin_addr)<<":"<<ntohs(to.sin_port)<<":"<<ret<<"长度,"<<recvBuffer<<endl;if(strcmp(recvBuffer,"quit")==0)break;}return0;}//服务器//UDP-server.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<winsock2.h>#include<iostream>#include<cstdlib>#pragmacomment(lib,"WS2_32")//链接到WS2_32.lib#defineBUFFERLEN256usingnamespacestd;classCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmajorVer=2){//初始化WS2_32.dllWSADATAwsaData;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(::WSAStartup(sockVersion,&wsaData)!=0){exit(0);}}~CInitSock(){::WSACleanup();}};DWORDWINAPISendProc(LPVOIDlparam);DWORDWINAPIRecvProc(LPVOIDlparam);DWORDWINAPIListenProc(LPVOIDlparam);sockaddr_infrom={0};intfromLen=sizeof(from);HANDLEh[2]={0};intmain(){CInitSockserverinit;SOCKETsServerSocket=socket(AF_INET,SOCK_DGRAM,0);sockaddr_insin;intlen=sizeof(sin);ZeroMemory(&sin,sizeof(sin));sin.sin_port=htons(8080);sin.sin_family=AF_INET;sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");bind(sServerSocket,(constsockaddr*)&sin,len);HANDLEh[2];h[0]=CreateThread(NULL,0,SendProc,(LPVOID)sServerSocket,0,NULL);h[1]=CreateThread(NULL,0,RecvProc,(LPVOID)sServerSocket,0,NULL);WaitForMultipleObjects(1,h,TRUE,INFINITE);closesocket(sServerSocket);system("pause");return0;}DWORDWINAPISendProc(LPVOIDlparam){charsendBuffer[BUFFERLEN];SOCKETs=SOCKET(lparam);while(1){cin>>sendBuffer;if(from.sin_addr.S_un.S_addr==0){cout<<"还没有会话方"<<endl;continue;}intret=sendto(s,sendBuffer,strlen(sendBuffer),0,(constsockaddr*)&from,fromLen);if(ret<=0)break;if(strcmp(sendBuffer,"quit")==0)break;}return0;}DWORDWINAPIRecvProc(LPVOIDlparam){SOCKETs=(SOCKET)lparam;charrecvBuffer[BUFFERLEN];charsendBuffer[BUFFERLEN];while(1){memset(recvBuffer,0,BUFFERLEN);memset(sendBuffer,0,BUFFERLEN);intret=recvfrom(s,recvBuffer,BUFFERLEN,0,(sockaddr*)&from,&fromLen);sendto(s,sendBuffer,strlen(sendBuffer),0,(constsockaddr*)&from,fromLen);if(ret<=0)break;cout<<"from"<<inet_ntoa(from.sin_addr)<<":"<<ntohs(from.sin_port)<<":"<<ret<<"长度,"<<recvBuffer<<endl;if(strcmp(recvBuffer,"quit")==0)break;}return0;}

解决方案

解决方案二:
在同一内网?
解决方案三:
这不是C/C++代码吗?。。而且代码还没有格式化我也没有在你的代码里面看到你有给你的客户端发送什么。。。。
解决方案四:
可以借助抓包工具先确认server已经向client发出了数据
解决方案五:
我在客户端和服务器端都创建了两个线程,分别用来接收和发送,服务器接收和发送都没问题,但客户端发送消息后,服务器能收到,就是接收不到服务器发来的数据。在服务器检测发送数据成功,不知道为什么。

时间: 2024-08-31 22:12:20

UDP多线程传输,为什么客户端向服务器发送数据,能收到;服务器向客户端发数据却不能收到?的相关文章

idudp delphi-IdUdpclient?向服务器发送消息后,服务器返回消息给客户端

问题描述 IdUdpclient?向服务器发送消息后,服务器返回消息给客户端 ?IdUdpclient?向服务器发送消息后,服务器返回消息给客户端,代码如下: ?with?IdUDPClient1?do ??begin ????Host?:=?'192.168.0.18'; ????Port?:=?3000; ????Send('GET_DATE_LIST'); ????s?:=?ReceiveString(); ????ShowMessage(s); ??end; 但是返回的不是服务器的数据字

android-安卓客户端向服务器发送的http,服务器是怎样识别的

问题描述 安卓客户端向服务器发送的http,服务器是怎样识别的 安卓客户端向服务器发送的http,服务器是怎样识别的????----- 解决方案 不知道你说的识别是什么意思.用jsp或者asp.net等写一个服务器端,收到请求,包含用户名或者 token,然后判断. 解决方案二: 安卓客户端就相当你平时的web端,和正常的http请求是一样,Android端模拟http请求,你需要引入额外的jar httpclient相关jar包,具体的就不说了.期望对你有帮助. 解决方案三: 我也不懂你说的是

winform中点击按钮向web服务器发送请求并接受服务器返回的一个hash数据

问题描述 要做一个oa登录页面,要winform形式的,点击一个按钮向服务器传递客户端本地的系统用户名和ip地址,服务器接收后就不管我事了,他处理完给我传回一个hash数据,我再通过System.Diagnostics.Process.Start("http://...?user=系统用户名&hash=服务器传回的hash值");这样就行了,问题是我怎么向他发送我本地的系统用户名和ip,然后又怎么接收他传回的hsah数据,服务器是web服务器,而我的登录界面是winform的,

Android编程向服务器发送请求时出现中文乱码问题的解决方法_Android

本文实例讲述了Android编程向服务器发送请求时出现中文乱码问题的解决方法.分享给大家供大家参考,具体如下: 我们在andorid项目中通过get方式向服务器发送请求,其中url参数带有中文,将会产生乱码,乱码产生的原因有两种: 1. 在提交参数时,没有对中文参数进行URL编码 2. Tomcat服务器默认采用的是IOS8859-1编码(不支持中文)得到参数值 解决: 1. 进入android项目,在其中要提交参数的时候,对参数的值进行编码: 复制代码 代码如下: URLEncoder.enc

delphi tcp utf8-delphi tcp客户端以utf8发送字符串

问题描述 delphi tcp客户端以utf8发送字符串 delphi中建立TIdTCPClient客户端,然后Client.Write(s),s中包含汉字; 服务端以utf8读取会出现乱码.请问怎么将s转化为utf8发过去.

垃圾邮件服务器数据泄露 惊现7亿条邮件地址数据 暴露了Onliner垃圾邮件黑产

近日,来自巴黎的恶意软件研究人员Benkow发现,一台服务器因配置不当,被Onliner 垃圾邮件 僵尸程序(Spambot)入侵并利用,入侵的服务器中存有7亿多条数据供Onliner使用,包括大量的邮件地址.密码和SMTP配置.随后,研究人员Troy Hunt将这些数据添加到了自己的"Have I Been Pwned (HIBP)"网站及服务中. Onliner垃圾邮件服务器数据泄露 对涉事服务器进行追踪,发现其IP地址位于荷兰.Hunt在昨天的博文中写道, "我和Ben

qt udp 多线程-Qt 基于UDP的多线程文件传输

问题描述 Qt 基于UDP的多线程文件传输 发送端5个线程发送数据,接收端主线程接收到数据放入循环队列,同时接收端一个子线程从队列中取出数据并写入文件,但总丢包,不知道问题出在哪? 解决方案 有代码吗?丢包的原因太多了

android-安卓客户端向服务器发送的数据怎样保证安全

问题描述 安卓客户端向服务器发送的数据怎样保证安全 安卓客户端向服务器发送的数据怎样保证安全------------ 解决方案 (1)(4)就要求对服务器和客户端双向进行令牌或者证书验证 (2)可以用ssl等加密传输 (3)数字签名 解决方案二: 首先搞清楚为什么不安全. 主要的风险包括: (1)数据被发送到了不信任的服务器上 (2)数据被拦截监听 (3)数据被篡改 (4)客户端是假冒的

急急急!Jersey框架客户端发送一个参数给服务器,希望服务器查数据库返回一堆对象

问题描述 急急急!Jersey框架客户端发送一个参数给服务器,希望服务器查数据库返回一堆对象 应该怎么实现,jersey下怎么把查询的结果转为List,List怎么传回客户端 解决方案 最好序列化成json,然后直接回传就可以