// 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;
}