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
原创粉丝点击