永发信息网

Socket 这样写为什么收不到数据

答案:1  悬赏:80  手机版
解决时间 2021-03-19 03:44
#include
#include

using namespace std;

#pragma comment(lib,"Ws2_32.lib")


int StartupSocket()
{
WSADATA data;

int rc = WSAStartup(MAKEWORd(2,2), &data);
if(NO_ERROR != rc)
{
cout<<"startup socket failed!"< return 0;
}

return rc;
}

////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
//create udp socket
int UdpSocket(SOCKET &udp)
{
udp = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

if(INVALID_SOCKET == udp)
{
cout<<"create socket failed!"< return 0;
}

return udp;
}

WSAEVENT hUdpEvent = NULL;

int UdpCreateEvent(void)
{
if(NULL == hUdpEvent)
{
hUdpEvent = WSACreateEvent();
if(NULL == hUdpEvent)
{
cout<<"Net event create failed!"< return 0;
}
}
return (int)hUdpEvent;
}

int UdpRegEvent(SOCKET &udp)
{
return WSAEventSelect(udp,hUdpEvent,FD_WRITE | FD_READ);
}

sockaddr_in hssAddr;

int UdpBind(SOCKET &udp,int port=20104,unsigned long addr = 0)
{
hssAddr.sin_family = AF_INET;
hssAddr.sin_port = htons(port);
hssAddr.sin_addr.s_addr = htonl(addr);

int ret = bind(udp,(SOCKADDR *)&hssAddr,sizeof(hssAddr));
if(0 != ret)
{
cout<<"bind socket error!"< cout<<"error code:"< }

return ret;
}

typedef int (* UdpHssMsgHandle)(SOCKET &udp,int msgType);

int UdpEventOccur(SOCKET &udp,HANDLE hEvent,UdpHssMsgHandle msg)
{
WSANETWORKEVENTS networkEvents;
int ret = 0;

while(true)
{
WSAWaitForMultipleEvents(1,&hEvent,FALSE,INFINITE,FALSE);

//可信
ret = WSAEnumNetworkEvents(udp,hEvent,&networkEvents);

if(0 != ret)
{
cout<<"error occurs when wait for events"< return 0;
}

if((networkEvents.lNetworkEvents & FD_READ) && (networkEvents.iErrorCode[FD_READ_BIT] == 0))
{
//recvfrom
msg(udp,1);

}
if(networkEvents.lNetworkEvents & FD_WRITE)
{
//sendto
msg(udp,2);
}
}

return 0;
}

int UDP_Test(SOCKET &udp,int msgType)
{
char buf[255];
int fromlen = 0;
int ret = 0;

memset(buf,0,255);

sockaddr_in msgAddr;
msgAddr.sin_family = AF_INET;
msgAddr.sin_port = hssAddr.sin_port;
msgAddr.sin_addr.s_addr = hssAddr.sin_addr.s_addr;

ret = recvfrom(udp,buf,255,0,(sockaddr *)&msgAddr,&fromlen);

buf[fromlen] = '\0';
cout<<"receive data:"< cout<<"fromlen:"< cout< cout<<"end."< cout<<"ret"<
return 0;
}

//清场函数
int UdpClean(void)
{
WSACleanup();
if(NULL != hUdpEvent)
{
WSACloseEvent(hUdpEvent);
}
return 0;
}
int main()
{
SOCKET server;
StartupSocket();
UdpCreateEvent();
UdpSocket(server);
UdpBind(server);
UdpRegEvent(server);
UdpEventOccur(server,hUdpEvent,&UDP_Test);
closesocket(server);
UdpClean();
return 1;
}

问题已解决:recvfrom(udp,buf,255,0,(sockaddr *)&msgAddr,&fromlen);
fromlen需传入msgAddr的大小才行
最佳答案
int UdpEventOccur(SOCKET &udp,HANDLE hEvent,UdpHssMsgHandle msg)
{
WSANETWORKEVENTS networkEvents;
int ret = 0;

while(true)
{
WSAWaitForMultipleEvents(1,&hEvent,FALSE,INFINITE,FALSE);

//可信
ret = WSAEnumNetworkEvents(udp,hEvent,&networkEvents);

if(0 != ret)
{
cout<<"error occurs when wait for events"< return 0;
}

if((networkEvents.lNetworkEvents & FD_READ) && (networkEvents.iErrorCode[FD_READ_BIT] == 0))
{
//recvfrom
msg(udp,1);

}
if(networkEvents.lNetworkEvents & FD_WRITE)
{
//sendto
msg(udp,2);
}
}

return 0;
}

int UDP_Test(SOCKET &udp,int msgType)
{
char buf[255];
int fromlen = 0;
int ret = 0;

memset(buf,0,255);

sockaddr_in msgAddr;
msgAddr.sin_family = AF_INET;
msgAddr.sin_port = hssAddr.sin_port;
msgAddr.sin_addr.s_addr = hssAddr.sin_addr.s_addr;

ret = recvfrom(udp,buf,255,0,(sockaddr *)&msgAddr,&fromlen);

buf[fromlen] = '\0';
cout<<"receive data:"< cout<<"fromlen:"< cout< cout<<"end."< cout<<"ret"<
return 0;
}

//清场函数
int UdpClean(void)
{
WSACleanup();
if(NULL != hUdpEvent)
{
WSACloseEvent(hUdpEvent);
}
return 0;
}
int main()
{
SOCKET server;
StartupSocket();
UdpCreateEvent();
UdpSocket(server);
UdpBind(server);
UdpRegEvent(server);
UdpEventOccur(server,hUdpEvent,&UDP_Test);
closesocket(server);
UdpClean();
return 1;
}
你的函数结构有问题,
顺序都反了int UdpEventOccur(SOCKET &udp,HANDLE hEvent,UdpHssMsgHandle msg)
int UDP_Test(SOCKET &udp,int msgType)
你调试下看是不是函数反了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
进口伊马替尼60片一盒多少钱
13年智跑氧传感器电压是多少
刘三姐被抓后和阿牛在江中对唱的歌叫什么
一片GTX1080Ti=多少片RX580
跪求大家的宝贵意见~~ 大学的文艺部想要举办
如意印刷厂怎么去啊,有知道地址的么
甲减的饮食以及如何调理?
星空棒棒糖背面是黑的,还是全透明的?
十二月四日是什么星座
人类未来会有时光机吗?
华为荣耀3c丽江实体店价格
今天买了一双纽百伦678是正品吗,它合格证上
古代的读书人是不是都必须要把《四书五经》全
有首歌,歌词有一首是这样的:在那阡陌人生的
城镇土地使用税怎么计算
推荐资讯
在中国水利水电十局签定一年制合同工以工作四
微信公众号ios没有打赏功能吗
发票开了,后面还没报销,但店已经注销了,发票
240克比3/5克?emmmmmm快点。
建行转账怎么转
一般麻辣烫多少钱一斤
为什么lol战区只能看到十几个人
黎的部首怎么读
春兰空调地址在哪,我要去那里办事
酒立方地址在什么地方,想过去办事
香檀一号正门地址在哪,我要去那里办事
苹果手机有十二点qq自动离线功能 那苹果手机
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?