在文章Windows网络编程:一文深入理解Winsock里Jungle详细介绍了Winsock的头文件、面向连接的通信(TCP/IP)和无连接的通信(UDP/IP),Windows网络编程:Winsock实现客户端与服务器文件传输(TCP/IP)中Jungle基于Winsock实现了面向连接的通信,即利用TCP/IP协议通信。本文,Jungle将展示利用UDP/IP实现发送端与接收端的通信。
1.接收端
具体步骤和概念在此不再赘述,见Windows网络编程:一文深入理解Winsock。
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment ( lib,"WS2_32.lib" )
#define RECEIVER_ADDRESS "127.0.0.1"
#define PORT 8000
void transAddrToBuf(SOCKADDR_IN sockAddr, char* buffer)
{
if (!buffer){
return;
}
sprintf(buffer, "%s:%d", inet_ntoa(sockAddr.sin_addr), ntohs(sockAddr.sin_port));
}
int main()
{
WSAData wasData;
SOCKET recvSocket;
SOCKADDR_IN receiverAddr;
char recvBuf[1024] = { 0 };
int recvBufLength = 1024;
SOCKADDR_IN senderAddr;
memset(&senderAddr, 0, sizeof(senderAddr));
int senderAddrLength = sizeof(senderAddr);
char senderInfo[30] = { 0 };
int ret = -1;
// 初始化
WSAStartup(MAKEWORD(2, 2), &wasData);
// 创建套接字
// 套接字类型—:UDP/IP-SOCK_DGRAM
// 协议:UDP-IPPROTO_UDP
recvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SOCKET_ERROR == recvSocket){
printf("Create Socket Error!");
goto exit;
}
// 创建一个SOCKADDR_IN结构,指定接收端地址信息
receiverAddr.sin_family = AF_INET; // 使用IP地址族
receiverAddr.sin_port = htons(PORT); // 端口号
receiverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
// bind将地址信息和套接字关联
ret = bind(recvSocket, (SOCKADDR*)&receiverAddr, sizeof(receiverAddr));
if (0 != ret){
printf("bind error with ErrorNum %d\n",WSAGetLastError());
goto exit;
}
// 接收数据报
while (1){
ret = recvfrom(recvSocket, recvBuf, recvBufLength, 0, (SOCKADDR*)&senderAddr, &senderAddrLength);
if (ret > 0){
printf("recv info:");
transAddrToBuf(senderAddr, senderInfo);
//printf("%s\n", senderInfo);
printf("%s\n", recvBuf);
}
}
exit:
closesocket(recvSocket);
system("pause");
return 0;
}
2.发送端
#include <stdio.h>
#include <WinSock2.h>
#pragma comment ( lib,"WS2_32.lib" )
#define RECEIVER_ADDRESS "127.0.0.1"
#define PORT 8000
int main()
{
WSAData wasData;
SOCKET sendSocket;
SOCKADDR_IN receiverAddr;
int addrLength = 0;
char sendBuf[1024] = "fengqiangguo";
int sendBufLength = 1024;
int ret = 0;
// 初始化
WSAStartup(MAKEWORD(2, 2), &wasData);
// 创建套接字
// 套接字类型—:UDP/IP-SOCK_DGRAM
// 协议:UDP-IPPROTO_UDP
sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SOCKET_ERROR == sendSocket){
printf("Create Socket Error!");
goto exit;
}
// 创建一个SOCKADDR_IN结构,指定接收端地址信息
receiverAddr.sin_family = AF_INET; // 使用IP地址族
receiverAddr.sin_port = htons(PORT); // 端口号
receiverAddr.sin_addr.S_un.S_addr = inet_addr(RECEIVER_ADDRESS);
while (1){
if (gets(sendBuf)){
ret = sendto(sendSocket, sendBuf, sizeof(sendBuf), 0, (SOCKADDR *)&receiverAddr, sizeof(receiverAddr));
if (0 == ret){
printf("fail to send\n");
}
printf("send info: %s\n", sendBuf);
memset(sendBuf, 0, sizeof(sendBuf));
}
}
exit:
closesocket(sendSocket);
system("pause");
return 0;
}
3.测试
欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
欢迎关注Jungle的微信公众号:Jungle笔记
回复“资料”,领取Jungle为您精心准备的41本计算机领域经典书籍!
回复“机器人”,领取四大家族相关的机器人资料大礼包!