TCP/IP编程调用Windows的库实现UDP网络通信(代码实例)
2023-03-14 22:47:06 时间
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 ", buf); } // printf("IP = %u ", sendaddr.sin_addr.s_addr); } closesocket(st);//使用完socket要将其关闭 WSACleanup();//释放win下socket内部的相关资源 return rc; }
最后先运行接收,然后尝试使用发送端发送字符,成功了!(记住一定要关闭防火墙以及设置好系统环境变量,否则会出现程序无法启动(环境变量没有设置好,找不到libwin_32dll的库)以及接收端被防火墙屏蔽无法接收数据)
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的