云主机无法收到UDP信号的解决

C/C++/C#/C++Builder

// UDPSERVICE.cpp

include  <Windows.h>

include “stdafx.h”

include “WinSock.h”

define SOCK_VER 0x05

define udp_port 6001

pragma comment(lib,”ws2_32.lib”)

int UDPSERVICE(){
SOCKET g_sock;
//初始化环境
WSADATA wd = {0};
int nStart = WSAStartup(MAKEWORD(SOCK_VER,0),&wd);//函数成功返回0,失败返回错误代码
//错误处理
if (0 != nStart){
return 0;
}

if (2 != LOBYTE(wd.wVersion))
{
    return 0;
}

//创建socket套接字
g_sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (INVALID_SOCKET == g_sock){
    //sprinf(_T("无效的socket"));
    return 0;
}

//LogEvent(_T("socket 创建成功!"));

//绑定
sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(udp_port);
addr.sin_addr.s_addr = inet_addr("172.1.0.8"); 

//云主机采用的公网IP配置是映射的,无法直接绑定,这里用ipconfig/all看到的是172.x.x.x的IP。如果只绑定127.0.0.1无法接收到。绑定172的IP就可以了。

int nBind;
nBind = bind(g_sock,(sockaddr *)&addr,sizeof(addr));//成功返回0
if (0 != nBind){
    printf("绑定IP失败");
    return 0;
}

//获得已经绑定的端口号
int nLen = sizeof(addr);
getsockname(g_sock,(sockaddr *)&addr,&nLen);

printf("socket 成功绑定到端口:%d,等待数据。。。\n",ntohs(addr.sin_port));

//等待并接收数据
sockaddr_in saClient = {0};
int nFromLen = sizeof(saClient);
char szBuff[256] = {0};
int nSent = 0;
while(1){
    recvfrom(g_sock,szBuff,256,0,(sockaddr *)&saClient,&nFromLen);        

    if(nFromLen>0){
        printf("收到的信息:%s,从%s,%d \n",szBuff,inet_ntoa(saClient.sin_addr),ntohs(saClient.sin_port));

        //向客户端发送回应
        strcpy_s(szBuff,"OK!");
        nSent = sendto(g_sock,szBuff,strlen(szBuff)+1,0,(sockaddr *)&saClient,sizeof(saClient));
    }

    Sleep(10);
    if (0 == nSent){
        printf("WSAGetLastError:%d",WSAGetLastError());
    }else{
        printf("成功发出回应!!\n"); 
    }
}

//关闭资源
closesocket(g_sock);//关闭套接字

WSACleanup();//清理环境

return 1;

}