一.socket编程-套接字编程——UDP通信
UDP,用户数据报协议(UDP,User Datagram Protocol),UDP是面向无连接协议,面向无连接的意思是只有“传送数据”的过程,提供面向事务的简单不可靠信息传送服务。
即使是在网络拥堵的过程中,UDP也无法进行流量控制等避免网络拥塞,传输过程种丢包,UDP也不负责重发,甚至出现包的到达顺序乱掉的情况也无法纠正。
UDP往往可以用于以下情况:
• 包总量较少的通信(DNS,SNMP)
• 视频,音频多媒体通信(即时通讯)
• 广播通信
UDP编程模型:

二、UDP编程步骤:
1.初始化WASD
2.创建socket,指明使用的协议
3.收发数据
三、代码示例——使用UDP进行通信:
发数据端:
//初始化
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2) {
WSACleanup();
return 1;
}
//1. 创建socket, 指明要使用的协议什么
SOCKET sock = socket(
AF_INET, //ipv4协议族
SOCK_DGRAM, //数据报
IPPROTO_UDP);//udp协议
if (sock == INVALID_SOCKET)
{
printf("创建socket失败
");
return 0;
}
//3. 发数据
sockaddr_in siTo;
siTo.sin_family = AF_INET;
siTo.sin_port = htons(9527);
siTo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char szBuff[0x1000] = {"hello socket" };
int nBytesSend = sendto(sock,
szBuff,
sizeof(szBuff),
0,
(sockaddr*)&siTo, //客户端的的目标地址和端口
sizeof(siTo));
if (nBytesSend == SOCKET_ERROR)
{
closesocket(sock);
printf("接受数据失败
");
return 0;
}
//接收数据
sockaddr_in siRecv;
int nSizeOfSiRecv = sizeof(siRecv);
char szBuff0[MAXWORD + 1] = { 0 };
int nBytesRecv = recvfrom(sock,
szBuff0,
sizeof(szBuff0),
0,
(sockaddr*)&siRecv,
&nSizeOfSiRecv);
if (nBytesRecv == SOCKET_ERROR)
{
closesocket(sock);
printf("接受数据失败
");
return 0;
}
//清理
WSACleanup();
return 0;
收数据端:
//初始化
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2) {
WSACleanup();
return 1;
}
//1. 创建socket, 指明要使用的协议什么
SOCKET sock = socket(
AF_INET, //ipv4协议族
SOCK_DGRAM, //数据报
IPPROTO_UDP);//udp协议
if (sock == INVALID_SOCKET)
{
printf("创建socket失败
");
return 0;
}
//2.绑定端口,指明本进程端口是什么
sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(9527);//0x3725;
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//0x0100007f; //127.0.0.1
int nRet = bind(sock, (sockaddr*)&si, sizeof(si));
if (nRet == SOCKET_ERROR)
{
printf("端口绑定失败
");
closesocket(sock);
return 0;
}
//3.收数据
sockaddr_in siRecv;
int nSizeOfSiRecv = sizeof(siRecv);
char szBuff[MAXWORD] = { 0 };
int nBytesRecv = recvfrom(sock,
szBuff,
sizeof(szBuff),
0,
(sockaddr*)&siRecv,
&nSizeOfSiRecv
);
if (nBytesRecv == SOCKET_ERROR)
{
closesocket(sock);
printf("接受数据失败
");
}
//清理
WSACleanup();