CreateUDPServer
来源:互联网 发布:windows rmdir命令 编辑:程序博客网 时间:2024/06/18 04:44
前言
UDP可以自动分配IP和端口号.
如果UDP客户端和UDP服务器不在一台计算机上,需要自己按照本地IP填写UDPServer的IP.
测试代码
/// IP信息/// 定义这个结构的意义, struct sockaddr_in 不是1字节对齐的/// 传到发送方后, 取的内容是错的typedef struct _tag_IpInfo { short sin_family; u_short sin_port; char szIpAddr[MAX_PATH];}TAG_IPINFO;
SOCKET m_sUDPServer; struct sockaddr_in m_AddrUdpServer; TAG_IPINFO m_UdpServerIpInfo;
BOOL CClientDlg::CreateUDPServer() { BOOL bRc = FALSE; int iRc = 0; char szHostName[MAX_PATH] = {'\0'}; struct hostent* pHost = NULL; struct sockaddr_in addrTmp; int iLenAddr = 0; char* pcIp = NULL; do { if (INVALID_SOCKET != m_sUDPServer) { bRc = TRUE; break; } m_sUDPServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (INVALID_SOCKET == m_sUDPServer) { break; } addrTmp.sin_family = AF_INET; addrTmp.sin_port = 0; ///< port自动分配 /// UDP's IP不可以自动分配 /// 其它客户端可能并不在一台计算机内, 要用UDP来连接, 必须要有一个非回环IP地址 iRc = gethostname(szHostName, sizeof(szHostName)); if (SOCKET_ERROR == iRc) { break; } /// 在bind之前, 用本机的IP去填写要绑定的IP pHost = gethostbyname(szHostName); if (NULL == pHost) { break; } CopyMemory(&addrTmp.sin_addr, pHost->h_addr_list[0], pHost->h_length); iRc = bind(m_sUDPServer, (SOCKADDR*)&addrTmp, sizeof(addrTmp)); if (SOCKET_ERROR == iRc) { break; } /// 从m_sUDPServer取出信息, 填入m_UdpServerIpInfo ZeroMemory(&m_UdpServerIpInfo, sizeof(m_UdpServerIpInfo)); iLenAddr = sizeof(m_AddrUdpServer); iRc = getsockname(m_sUDPServer, (struct sockaddr *)&m_AddrUdpServer, &iLenAddr); if (SOCKET_ERROR == iRc) { break; } pcIp = inet_ntoa(m_AddrUdpServer.sin_addr); _tcscpy(m_UdpServerIpInfo.szIpAddr, (NULL != pcIp) ? pcIp : ""); m_UdpServerIpInfo.sin_port = m_AddrUdpServer.sin_port; m_UdpServerIpInfo.sin_family = m_AddrUdpServer.sin_family; /** run result - m_UdpServerIpInfo {...} sin_family 2 sin_port 28404 + szIpAddr 0x0018f7fc "192.168.2.60" */ bRc = TRUE; } while (0); if (!bRc) { ShowSocketErrMsg(); } /// udp server can loop by recvfrom /// sender can use m_UdpServerIpInfo sendto udp server return bRc;}
0 0
- CreateUDPServer
- #pragma once与#ifndef两种防止头文件二次编译的区别
- 1209:Catch That Cow(bfs)
- mfc获取实时网速的头文件及cpp
- Cocos2dx项目--动作类游戏内存优化--Spine结构分析1
- 40.leetcode题目:
- CreateUDPServer
- iOS笔记_01_UIView初见
- FTP站点+FTP相关问题集
- [IMX6Q][Android5.1]移植笔记 --- LCD显示移植(LVDS接口)
- EGLImage in SurfaceFlinger
- 用xutils3.0来访问 spring boot,带权限验证
- String.format() 字符串的格式化
- Android报error -1073741819 libcocos2dxinternal.a
- 使用ChannelFactory类实现动态调用WCF地址