C语言UDP socket编程

2023-05-16

C语言UDP socket编程

UDP 服务器步骤如下:

  • 1.创建等链接套接字fd=socket()
  • 2.绑定待链接套接字bind(fd,服务器ip和端口)
  • 3.等待信息recvfrom(fd,对端地址)

UDP 客户端步骤如下:

  • 1.创建待连接套接字fd=scoket()
  • 2.发送信息sendto(fd,服务器ip和端口)

UDP服务器

int main(int argc, char const *argv[])
{
	// 创建一个UDP套接字
	int fd = Socket(AF_INET, SOCK_DGRAM, 0);

	struct sockaddr_in srvaddr;
	socklen_t len = sizeof(srvaddr);
	bzero(&srvaddr, len);

	srvaddr.sin_family = AF_INET;
	srvaddr.sin_port = htons(atoi(argv[1]));
	srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);

	// 绑定本地IP和端口
	Bind(fd, &srvaddr, len);

	// 迭代服务器
	char buf[SIZE];
	while(1)
	{
		bzero(buf, SIZE);
		recvfrom(fd, buf, SIZE, 0, NULL, NULL);

		printf("%s", buf);
	}

	return 0;
}

UDP客户端

int main(int argc, char const *argv[])
{
	// 创建一个UDP套接字
	int fd = Socket(AF_INET, SOCK_DGRAM, 0);

	struct sockaddr_in srvaddr;
	socklen_t len = sizeof(srvaddr);
	bzero(&srvaddr, len);

	srvaddr.sin_family = AF_INET;
	//srvaddr.sin_addr.s_addr = inet_addr("192.168.0.166");  
	inet_pton(AF_INET, arg[1], &srvaddr.sin_addr);
	srvaddr.sin_port = htons(atoi(argv[2]));


	char buf[SIZE];
	while(1)
	{
		bzero(buf, SIZE);
		fgets(buf, SIZE, stdin);

		sendto(fd, buf, strlen(buf), 0,
				(struct sockaddr *)&srvaddr, len);
	}

	return 0;
}

socket API做了如下封装


ssize_t Write(int fildes, const void *buf, size_t nbyte)
{
	ssize_t retval = write(fildes, buf, nbyte);
	if(retval == -1)
	{
		perror("write() error");
	}

	return retval;
}

ssize_t Read(int fildes, void *buf, size_t nbyte)
{
	int ret = read(fildes, buf, nbyte);
	if(ret == -1)
	{
		perror("read() failed");
	}
	return ret;
}

int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
	int ret = bind(sockfd, addr, addrlen);
	if(ret == -1)
	{
		perror("bind() failed");
	}
	return ret;
}

int Listen(int sockfd, int backlog)
{
	int ret = listen(sockfd, backlog);
	if(ret == -1)
	{
		perror("listen() failed");
	}
	return ret;
}

int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
	int ret = accept(sockfd, addr, addrlen);
	if(ret == -1)
	{
		perror("accept() failed");
	}
	return ret;
}

int Connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
	int ret = connect(sockfd, addr, addrlen);
	if(ret == -1)
	{
		perror("connect() failed");
	}
	return ret;
}

int Socket(int domain, int type, int protocol)
{
	int sockfd = socket(domain, type, protocol);
	if(sockfd == -1)
	{
		perror("socket() error");
	}

	return sockfd;
}

int Setsockopt(int sockfd, int level, int optname,
	       const void *optval, socklen_t optlen)
{
	int retval = setsockopt(sockfd, level, optname, optval, optlen);
	if(retval == -1)
	{
		perror("setsockopt() error");
	}

	return retval;
}

int Select(int nfds, fd_set *readfds, fd_set *writefds,
	   fd_set *exceptfds, struct timeval *timeout)
{
	int ret = select(nfds, readfds, writefds, exceptfds, timeout);
	if(ret == -1)
	{
		perror("select() failed");
	}
	return ret;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言UDP socket编程 的相关文章

  • 在不使用环回网络的情况下将数据包转发到同一主机中的服务

    我有这个 libnetfilter queue 应用程序 它根据某些 iptables 规则从内核接收数据包 在直接讨论我的问题之前 我提供了一个示例可行代码和其他工具来设置测试环境 以便我们的问题定义和可能的解决方案可以更加准确和稳健 以
  • 如何设置Winsock UDP套接字?

    我想创建一个仅向客户端发送数据的 Winsock UDP 套接字 我希望内核为我选择一个可用的端口 另一方面 我想指出要使用哪个本地 IP 因为我正在运行一些网卡 我尝试过梳理迷宫般的套接字选项 以及将套接字地址中的端口绑定设置为 0 但均
  • 数据报总是被完整接收吗?

    大多数数据报接收函数 例如c的recv或read java的DatagramPacket类或python的SocketServer 都包含找出接收数据量的可能性 c int amount recv sock buf n MSG WAITAL
  • 简单的udp代理解决方案

    我正在寻找可以代理我的 udp 数据包的解决方案 我有一个客户端向服务器发送 udp 数据包 它们之间的连接非常糟糕 导致大量数据包丢失 一种解决方案是使用一个新的代理服务器 它将所有数据包从客户端重定向到目标服务器 新的代理服务器与这两个
  • Java:使用多个 DatagramSocket 接收 UDP 数据报包

    我正在尝试实现一种将 UDP 数据包发送到多个接收者的方法 我认为这应该是可行的设置setReuseAddress true 在接收 DatagramSocket 实例上 我的问题是 在某些情况下 我需要限制与本地计算机的通信 因此限制本地
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • DatagramChannel.close() 在 Windows 上保持端口打开

    我正在实施一个发现流程 打开 UDP 套接字以侦听给定端口上的广播响应 发送一些请求 并期待稍后的响应 在给定时间段后关闭 UDP 套接字 第一次通话有效 但其他调用会出现绑定错误 地址已被使用 绑定 我运行的是Windows 7 我做了一
  • 接收来自 N 个客户端的响应,以回复通过 UDP 的广播请求

    我正在为特定类型的网络多媒体设备实现一种 IP 查找器 我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息 设备有自己的设备发现方式 其工作原理如下 客户端通过 UDP 通过 LAN 发送广播请求 目的端口号是固定的 作
  • 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这就是问题 它非常简单 理解 我家里有 2 台电脑 它们都有相同的公共 IP 地址 例如 1 2 3 4 我在咖啡馆有一台计算机 不同的网络 因此它具
  • iOS 14 在进行本地网络广播时给出“操作系统错误:错误的文件描述符,errno = 9”

    做一点Jeopardy 风格问答 https stackoverflow blog 2011 07 01 its ok to ask and answer your own questions here 我正在 Flutter 中开发一个应
  • 如何在QT中发送和接收UDP数据包

    我正在 QT 中编写一个小型应用程序 它通过本地网络发送广播 UDP 数据包 并等待来自网络上的一个或多个设备的 UDP 响应数据包 创建套接字并发送广播数据包 udpSocketSend new QUdpSocket this udpSo
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Windows 操作系统中无法访问的 IP 套接字关闭时间

    这些代码通过用户数据报协议提供发送数据 下面有两个代码 当我使用第一个代码来处理无法访问的 IP 地址时 我得到了三秒的延迟 请查看新结果标题 只需打开新的 C 控制台应用程序并将这些代码粘贴到其中 第一个代码 using System u
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 错误号:11,资源暂时不可用

    我正在使用 c 套接字来实现可靠的 UDP 协议 我正在使用以下代码在等待确认的套接字上设置超时 我不确定为什么会收到 errno 11 资源暂时不可用 set timer for recv socket struct timeval tv

随机推荐

  • 项目代码训练教程

    配置好matconvnet后 xff0c deep model下有三个文件夹 xff0c 分别是我们的方法 xff1a FOC SDeCNN try和SDeCNN方法 xff1a HSI SDeCNN train1 2 3 HSI SDeC
  • 每日一篇论文推荐

    每日一篇论文推荐 7 5 Unsupervised Hyperspectral Denoising Based on Deep Image Prior and Least Favorable Distribution7 6 WINNet W
  • ISP图像信号处理 | GAMES204-计算成像

    图像信号处理 GAMES204 计算成像 Dead Pixel CorrectionBlack Level CompensationAnti aliasingLens Shading CorrectionNoise Reduction3AS
  • np.max()、np.argmax()、np.maximum()、np.min()、np.argmin()、np.minimum()、np.sum()

    numpy专题 最值 求和 最大值np max np argmax np maximum 求和np sum 网上已经有很多对于这几个函数的讲解资料 xff0c 但总感觉讲得有些乱 xff0c 特别是对于高维数组 xff0c 如果指定了某个轴
  • Cortex-M3 (NXP LPC1788)之EEPROM存储器

    EEPROM是一种非易失性存储器 xff0c 主要用于存储相对少量的数据 xff0c 如存储一些系统的配置信息 通过系统的EEPROM控制模块可以轻松的进行EERPOM的存储控制 要正确使用EEPROM需要配置掉电寄存器EEPWRDWN确定
  • sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string

    错误信息 sqlalchemy exc ArgumentError Could not parse rfc1738 URL from string 原 flask sqlacodegen mysql root 64 127 0 0 1 fo
  • 面试题汇总:网络编程

    1 tcp和udp的区别 xff1f xff08 1 xff09 TCP面向连接 xff08 如打电话要先拨号建立连接 xff09 UDP是无连接的 xff0c 即发送数据之前不需要建立连接 xff1b xff08 2 xff09 TCP提
  • CentOS7 安装学之思开源考试系统Mysql版

    环境介绍 序号项目版本1操作系统CentOS Linux release 7 9 2009 Core 2redis7 0 03Mysqlmysql Ver 8 0 29 for Linux on x86 64 MySQL Community
  • Cisco catalyst 交换机升级步骤

    交换机升级步骤 1 准备一个FAT32的U盘 2 到cisco官网上下载交换机镜像 3 将U盘插到交换机上 xff0c 登入交换机concole输入dir usbflash0 xff1a 找到该镜像 xff0c 注意镜像不要放在中文目录下
  • 【性能】【内存】zram解读

    1 背景 nbsp 通过压缩长时间不在前台的进程来节省内存占用 不会像swap一样频繁操作闪存 也可以减少IO操作节省资源 延长闪存寿命 不过内存压缩是一种用时间换空间 的方式 cpu解压缩过程也是需要消耗少量cpu资源 尽管当前andro
  • wifi连接过程抓包

    下面是一次wifi连接过程发送数据的抓包 xff0c 有些包没抓到 xff0c 但还是比较全的 1 4包 xff0c 探测请求 响应过程 STA发出探测请求包Probe ReqAP做出回应 xff0c 发出探测响应包Probe Rsp 5
  • mbedtls学习(6)RSA算法

    RSA算法 RSA算法是一种非对称加密算法 xff0c 特点时加密解密算法不同且加密解密密钥不同 xff0c 即一般公钥加密 xff0c 私钥解密 下面时RSA算法关键参数 n 模数 xff0c 位长度为1024比特或者2048比特e 公开
  • LVGL lv_label标签控件(5)

    lv label 相关API在lv label h中 文本模式 span class token keyword enum span span class token punctuation span span class token co
  • LVGL lv_page页面控件(23)

    lv page 页面控件 xff0c 是由2个lv cont容器控件构成 xff0c 其中一个容器作为lv page页面控件的背景层 xff0c 另一个容器作为lv page页面控件的载体 xff0c 此载体存放其他任何子对象 xff0c
  • FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤

    文章目录 消息队列消息队列结构读队列步骤写队列步骤 作用 信号量信号量结构 获取信号量释放信号量 互斥量 xff08 锁 xff09 互斥量结构 获取互斥量释放互斥量 递归互斥量 xff08 递归锁 xff09 获取递归互斥量释放递归互斥量
  • GDB调试宏

    参考 GDB需要调试宏只需用 g3选项编译 g 默认选项 xff0c 同 g2 g0 不生成任何调试信息 xff0c 和编译时不加 g 是一样的 g1 生成最少量的调试信息 xff0c 这些信息足够用来通过backtrace查看调用栈符号信
  • GDB格式化打印结构体

    参考 GDB pretty print set print pretty on GDB 打印数组索引 set print array span class token operator span indexes on 例子 span cla
  • 8080接口

    文章目录 简介引脚写时序读时序 简介 8080接口是由英特尔设计 xff0c 是一种并行 异步 半双工通信协议 xff0c 作用是用于外扩RAM ROM xff0c 后面也用于LCD接口 引脚 写时序 先拉低选中器件 xff0c 如果要写入
  • Centos 7离线安装最新版mysql

    测试环境 CentOS Linux release 7 9 2009 Core 1 准备工作 下载离线安装包 xff1a 1 1 浏览器打开地址 xff1a https dev mysql com downloads mysql 1 2 选
  • C语言UDP socket编程

    C语言UDP socket编程 UDP 服务器步骤如下 xff1a 1 创建等链接套接字fd 61 socket 2 绑定待链接套接字bind fd 服务器ip和端口 3 等待信息recvfrom fd 对端地址 UDP 客户端步骤如下 x