UDP通信总结
2016-03-22 13:34
351 查看
1.必须先初始化网络编程接口
void UDPThread::InitWSA() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup(); return; } }
(创建套接字)
m_Socket = socket(AF_INET, SOCK_DGRAM,0); if (m_Socket == INVALID_SOCKET) { DWORD errCode = GetLastError(); int x=1; }
2.设置接收端和发送端的ip和端口
(这里值得注意的是,接收端的ip最好设置为本机ip,我下面为自动获取本机ip接收端和发送端的端口不能相同,不能使用系统已经占用的端口,具体是否占用可以使用netstat -ano查看)
SOCKADDR_IN m_addrRecv; //接收端地址设置
SOCKADDR_IN m_addrSend; //发送端地址设置
m_addrRecv.sin_addr.S_un.S_addr=inet_addr(DHAboutComFunction::DHGetHostInfo::GetHostIp().GetBuffer(0)); //set the host IP m_addrRecv.sin_family=AF_INET; //set the protocol family m_addrRecv.sin_port=htons(iRecvPort); //我们接收数据的端口,也是对方发送数据的端口 m_addrSend.sin_addr.S_un.S_addr=inet_addr(chSendIp); //设置对方接收端的ip m_addrSend.sin_family=AF_INET; //set the protocol family m_addrSend.sin_port=htons(iSendport); //设置对方绑定的端口
3.如果要接收数据,则必须绑定接收端地址
if (bind(m_Socket,(SOCKADDR*)&m_addrRecv,sizeof(SOCKADDR)) == SOCKET_ERROR) { DWORD errCode = GetLastError(); //这儿显示失败代码 int x=1; }
4.接收的时候可以设置为循环接收
char pBufArr[500] = {0}; int LenAddr = sizeof(SOCKADDR); while(true) { int nRecvNum = recvfrom(m_Socket, pBufArr, 500, 0,(SOCKADDR*) &m_addrRecv, &LenAddr); if (nRecvNum>0) { //获取到数据之后要做的事情 //如果对方是按位发送的,则可以使用指针移位,然后memcpy拷贝到相应的结构体中 struct STT { char ch[4]; int sz; UCHAR uc; }; STT stt; memcpy(&stt , pBufArr, sizeof(STT));//取第一部分数据 char chbuf[20] ={0}; memcpy(chbuf , pBufArr + sizeof(STT), 20);//取第二部分数据... } }
5.如果要发送数据(memcpy)
void UDPThread::SendDateToFlat(char* chSend, size_t len ) { //比如发送一个结构体 struct STT { char ch[4]; int sz; UCHAR uc; }; STT stt; memcpy(stt.ch, "aaaa", 4); stt.sz = 10; stt.uc = 0x01; int nSendNum = sendto(m_Socket, (char*)&stt, sizeof(stt), 0, (SOCKADDR*) &m_addrSend, sizeof(SOCKADDR)); //如果返回值<=0则发送失败 }
6.使用完之后需要关闭socket和WSA
closesocket(m_Socket); WSACleanup();
相关文章推荐
- 百度地图3.7.1的配置
- JAVA集合的学习
- oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]
- Xentrace使用教程
- TinyXml Print 函数 Bug
- iOS 图片左右反转 反向
- 移动web页面前端开发总结
- Qt5自带加密方法
- ftrace的使用【转】
- 检测数据库各实例session 阻塞 tree的sql
- 常用正则表达式整理
- Exchange 2013 证书配置
- LeetCode[258]——Add Digits
- 求素数
- 解引用和箭头操作符
- DM9000网卡的基本工作原理
- iOS 宏(define)与常量(const)的正确使用
- android 加载图片
- javascript知识结构
- OCX控件的简单开发实例