C 语言 devc++ 使用 winsock 实现 windows UDP 利用 IP 进行局域网发送消息

news/2024/5/18 12:35:53 标签: udp, 网络协议, 网络

UDP 通信流程_udp通信过程-CSDN博客参考来源

UDP 通信流程_udp通信过程-CSDN博客

这里移植到windows 上 ,使用 devc++ 开发。 

服务端代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <winsock2.h>

int main()
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data;
	if (WSAStartup(sockVersion, &data) != 0)
	{
		return 0;
	}
	// 1. 创建通信的套接字
	SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (fd == INVALID_SOCKET)
	{
		printf("无效的 socket !");
		return 0;
	}

	// 2. 通信的套接字和本地的IP与端口绑定
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(9999);    // 大端
	addr.sin_addr.s_addr = htonl(INADDR_ANY);  // 0.0.0.0
	int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
	if(ret == -1)
	{
		perror("bind");
		exit(0);
	}

	char buf[1024];
	struct sockaddr_in cliaddr;
	int len = sizeof(cliaddr);
	// 3. 通信
	while(1)
	{
		// 接收数据
		memset(buf, 0, sizeof(buf));
		int rlen = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &len);
		printf("客户端的IP地址: %s, 端口: %d\n",
		       inet_ntoa(cliaddr.sin_addr),
		       ntohs(cliaddr.sin_port));
		printf("客户端say: %s\n", buf);

		// 回复数据
		// 数据回复给了发送数据的客户端
		sendto(fd, buf, rlen, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
	}

	close(fd);

	return 0;
}

客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <winsock2.h>

int main()
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data;
	if (WSAStartup(sockVersion, &data) != 0)
	{
		return 0;
	}
	// 1. 创建通信的套接字
	SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (fd == INVALID_SOCKET)
	{
		printf("无效的 socket !");
		return 0;
	}

	// 2. 通信的套接字和本地的IP与端口绑定
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(9999);    // 大端
//	addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);  // 255.255.255.255 广播 
	char loa[16] = "127.0.0.1";						// 这是指定 IP发送数据 
	addr.sin_addr.S_un.S_addr = inet_addr(loa);				// 加入指定 IP 


	char buf[1024];
    char ipbuf[64];
    int num = 0;
    // 2. 通信
    while(1)
    {
        sprintf(buf, "hello, udp %d....\n", num++);
        // 发送数据, 数据发送给了服务器
        sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&addr, sizeof(addr));
 
        // 接收数据
        memset(buf, 0, sizeof(buf));
        recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        printf("服务器say: %s\n", buf);
        sleep(1);
    }
 
    close(fd);
 
    return 0;
}


http://www.niftyadmin.cn/n/5382150.html

相关文章

pwn学习笔记(4)ret2libc

pwn学习笔记&#xff08;4&#xff09; 静态链接&#xff1a; ​ 静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序&#xff0c;将一个或多个库或目标文件&#xff08;先前由编译器或汇编器生成&#xff09;链接到一块生成可执行程序。这…

SpringCloud微服务调用丢失请求头

在 Spring Cloud 中 微服务之间的调用会用到Feign&#xff0c;但是在默认情况下&#xff0c;Feign 调用远程服务存在Header请求头丢失问题。但基本上每个服务都会有一个全局globalId&#xff0c;能够清除调用链路&#xff0c;可以有两种解决方案 解决方案一 可以在每次远程调…

【数据结构】17 二叉树的建立

二叉树的建立 由于树是非线性结构&#xff0c;创建一颗二叉树必须首先确定树中结点的输入顺序&#xff0c;常用方法是先序创建和层序创建。 层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各…

进制转换对应表(建议形成肌肉记忆)

三位二进制对应十进制数&#xff0c;建议肌肉记忆&#xff01;&#xff01;&#xff08;在进行换算的时候脱口而出&#xff01;干净利落&#xff01;&#xff09; 如果还需要 2*n 阶层计算很浪费时间&#xff01; 四位二进制 对应十进制&#xff0c; 0000 - 0 &#xff1b; 0…

动态规划相关题目总结

221.最大正方形 设dp[i][j]为以点(i, j)为右下角的正方形最大边长&#xff0c;多画画图模拟模拟可以发现递推式dp[i][j] min(dp[i][j-1], dp[i-1][j-1], dp[i-1][j])1。 class Solution { public:int maximalSquare(vector<vector<char>>& matrix) {int n …

CSS实现两栏布局,左侧固定宽高,右侧超高滚动加载

要实现左侧子元素高度固定&#xff0c;右侧子元素超高滚动加载&#xff0c;并且左侧子元素与父级元素高度一致且不跟随滚动&#xff0c;可以使用CSS的flex布局和overflow属性来实现。 首先&#xff0c;将父级元素设置为flex布局&#xff0c;并将其分为左右两个子元素。左侧子元…

【Jvm】运行时数据区域(Runtime Data Area)原理及应用场景

文章目录 前言&#xff1a;Jvm 整体组成 一.JDK的内存区域变迁Java8虚拟机启动参数 二.堆0.堆的概念1.堆的内存分区2.堆与GC2.1.堆的分代结构2.2.堆的分代GC2.3.堆的GC案例2.4.堆垃圾回收方式 3.什么是内存泄露4.堆栈的区别5.堆、方法区 和 栈的关系 三.虚拟机栈0.虚拟机栈概念…

rtt的io设备框架面向对象学习-pwm设备

目录 1.pwm设备基类2.pwm设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.pwm设备基类 此层处于设备驱动框架层。该层的类也是抽象类。 在/ components / drivers / include / drivers 下的rt_drv_pwm.h定义了如下pwm设备基…