服务器端程序:
// UdpServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
//使用winsock所需的头文件
#include
//使用winsock所需的库文件
#pragma comment(lib,"WSOCK32.LIB")
//程序中要使用的winsock的主版本
#define SOCK_VER 2
//定义变量和函数
SOCKET g_sock = 0;
void ErrMsg(DWORD dwErr);
int main(int argc, char* argv[])
{
//初始化环境
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)
{
ErrMsg(WSAGetLastError());
return 0;
}
printf("socket 创建成功!!\n");
//绑定
sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(2800);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int nBind = bind(g_sock,(sockaddr *)&addr,sizeof(addr));//成功返回0
if (0 != nBind)
{
ErrMsg(WSAGetLastError());
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};
recvfrom(g_sock,szBuff,256,0,(sockaddr *)&saClient,&nFromLen);
printf("收到的信息:%s,从%s,%d \n",szBuff,inet_ntoa(saClient.sin_addr),ntohs(saClient.sin_port));
//向客户端发送回应
strcpy(szBuff,"OK!");
int nSent = sendto(g_sock,szBuff,strlen(szBuff)+1,0,(sockaddr *)&saClient,sizeof(saClient));
if (0 == nSent)
{
ErrMsg(WSAGetLastError());
}
else
{
printf("成功发出回应!!\n");
}
//关闭资源
closesocket(g_sock);//关闭套接字
system("pause");
WSACleanup();//清理环境
return 0;
}
//打印错误信息函数
void ErrMsg(DWORD dwErr)
{
char szErr[1024] = {0};
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),szErr,1024,NULL);
printf(szErr);
}
客户端程序:
// UdpClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include //套接字所需的头文件
#pragma comment(lib,"WSOCK32.LIB")//windows套接字的库文件
#define SOCK_VER 2 //程序使用的winsock主版本
//变量和函数的声明
SOCKET g_sock = 0; //套接字声明
void ErrMsg(DWORD dwErr);//错误信息打印
int main(int argc, char* argv[])
{
//初始化WinSock环境
WSADATA wd = {0};
int nStart = WSAStartup(MAKEWORD(SOCK_VER,0),&wd);
if (0 != nStart)
{
return 0;
}
if (LOBYTE(wd.wVersion) != 2)
{
return 0;
}
//创建一个UDP SOCKET
g_sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (INVALID_SOCKET == g_sock)
{
ErrMsg(WSAGetLastError());
return 0;
}
printf("socket 创建成功!!\n");
//发送数据的目标地址
sockaddr_in addr = {0};
addr.sin_family = AF_INET;//IPV4
addr.sin_port = htons(2800);//端口
addr.sin_addr.s_addr = inet_addr("127.0.0.1");//IP
//发送数据包
char szBuff[] = "hello UDP!!";
int nSent = sendto(g_sock,szBuff,strlen(szBuff)+1,0,(sockaddr * )&addr,sizeof(addr));
if (0 == nSent)
{
ErrMsg(WSAGetLastError());
}
else
{
printf("信息成功发送,等待回应。。\n");
}
//等待回应
sockaddr_in saServer = {0};
int nFromLen = sizeof(saServer);
*szBuff = '\0';//清空缓冲区
int nRecv = recvfrom(g_sock,szBuff,256,0,(sockaddr *)&saServer,&nFromLen);
if (SOCKET_ERROR == nRecv)
{
ErrMsg(WSAGetLastError());
}
else
{
printf("收到回应:%s从%s,%d\n",szBuff,inet_ntoa(saServer.sin_addr),ntohs(saServer.sin_port));
}
//关闭连接套接字
closesocket(g_sock);
system("pause");
//清理套接字环境
WSACleanup();
return 0;
}
//打印错误信息函数
void ErrMsg(DWORD dwErr)
{
char szErr[1024] = {0};
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),szErr,1024,NULL);
printf(szErr);
}
运行结果:
服务器端结果:
socket 创建成功!!
socket 成功绑定到端口:2800,等待数据。。。
收到的信息:hello UDP!!,从127.0.0.1,54381
成功发出回应!!
请按任意键继续. . .
客户端结果:
socket 创建成功!!
信息成功发送,等待回应。。
收到回应:OK!从127.0.0.1,2800
请按任意键继续. . .
标注:建立工程时选择新建一个新的简单工程,这样可以在创建一个新的工程里包含stdafx.h的头文件和cpp文件