UDP协议的实现:
UDP协议是基于IP的。(本文采用Qt进行开发实现,且结合了C/C++混合编程的知识)
1、新建一个源文件udp.c与头文件udp.h,并且在Qt项目文件中 添加Windows库“winsock2.h”如下:
2、在头文件创建UDP发送端和接收端函数:
#ifndef UDP_H
#define UDP_H
extern "C"
{
int Socket_send(char *ip);//udp发送
int Socket_recv();//接收端
}
#endif // UDP_H
3、接下来就是具体的代码实现了:
#include <stdio.h>
#include <winsock2.h>
int Socket_send(char *ip)
{
size_t vc = 0;
//初始化socket
char buf[1024] = {0};//传输使用的字符串
DWORD ver;
WSADATA wsaData;
ver = MAKEWORD(1,1);//调用wsastartup时告诉Windows使用的sock版本
WSAStartup(ver, &wsaData);
//创建socket结构体
SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);//建立一个socket
//创建结构体
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));//初始化结构体
addr.sin_family = AF_INET;//代表使用的是TCP/IP的地址
addr.sin_port = htons(8080);//设置使用的端口号
addr.sin_addr.s_addr = inet_addr(ip);//自检查网口IP
while(1)
{
memset(buf, 0, sizeof(buf));
gets(buf);
if(buf[0] == '0')
{//循环退出条件
break;
}
vc = sendto(st, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr));//发送函数
}
closesocket(st);//使用完socket要将其关闭
WSACleanup();//释放win下socket内部的相关资源
return vc;
}
int Socket_recv()
{
//初始化socket
char buf[1024] = {0};//传输使用的字符串
size_t rc = 0;
DWORD ver;
WSADATA wsaData;
ver = MAKEWORD(1,1);//调用wsastartup时告诉Windows使用的sock版本
WSAStartup(ver, &wsaData);
//创建socket结构体
SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);//建立一个socket
//创建结构体
struct sockaddr_in recvaddr;
memset(&recvaddr, 0, sizeof(recvaddr));//初始化结构体
recvaddr.sin_family = AF_INET;//代表使用的是TCP/IP的地址
recvaddr.sin_port = htons(8080);//设置使用的端口号
recvaddr.sin_addr.s_addr = htonl(INADDR_ANY);//接收端采用任意的IP地址
if(bind(st, (struct sockaddr *)&recvaddr, sizeof(recvaddr)) > -1)
{
struct sockaddr_in sendaddr;
memset(&sendaddr, 0, sizeof(sendaddr));
int len = sizeof(sendaddr);
while(1)
{
memset(buf, 0, sizeof(buf));
rc = recvfrom(st, buf, sizeof(buf), 0, (struct sockaddr *)&sendaddr, &len);
//rc = recv(st, buf, sizeof(buf), 0);
printf("recvive = %s\n", buf);
}
// printf("IP = %u\n", sendaddr.sin_addr.s_addr);
}
closesocket(st);//使用完socket要将其关闭
WSACleanup();//释放win下socket内部的相关资源
return rc;
}
最后先运行接收,然后尝试使用发送端发送字符,成功了!(记住一定要关闭防火墙以及设置好系统环境变量,否则会出现程序无法启动(环境变量没有设置好,找不到libwin_32dll的库)以及接收端被防火墙屏蔽无法接收数据)