UDP_Server

swoole深入学习 3. upd Server和udp Client swoole深入学习 3. upd Server和udp Client标签(空格分隔): swoole前面主要讲了tcp得server和client的业务处理,tcp有三次握手,有连接的概览,而UDP服务器与TCP服务器不同,UDP没有连接的概念。启动Server后,客户端无需Connect,直接可以向Server监听的端口发送数据包。server 接受数据的事件为onPacket, 发送给clie 阅读详情

基于UDP 的通信

UDP_Server

加载库

先写框架

//加载库

//创建套接字

while(true){

//发送消息

//接收消息

}

//关闭套接字

//卸载库

善于使用帮助文档

https://learn.microsoft.com/en-us/windows/win32/api/winsock2/

可以在代码中选中,按F1,直接跳转

语法

返回值:int

[in]:输入参数-需要自己赋值

Version:版本

[out]:输出参数-函数赋值-需要为指针类型

LP:指针

LPWSADATA:WSADATA类型的指针

[in/out]:输入输出参数

返回值

如果成功, WSAStartup 函数返回零。 否则,它将返回下面列出的错误代码之一。

要求

#include<iostream>
 #include<winsock2.h>
 //同一个解决方案下"",不同解决方案下<>
 //导入依赖库
 #pragma comment(lib,"Ws2_32.lib")
 using namespace std;
 int main(){
    //加载库
     WORD version=MAKEWORD(2,2);
     WSADATA data;
     int err=WSAStartup(version,&data);
     //判断返回值
     if(0!=err){
         cout<<"WSASartup error!"<<endl;
         WSACleanup();
         return 1;
     }
     //判断库的版本号对不对
     if(2!=HIBYTE(data.wVersion)||2!=LOBYTE(data.wVersion)){
         cout<<"WSASartup version error"<<endl;
         WSACleanup();
         return 1;
     }else{
         cout<<"wVersion success"<<endl;
     }
 }

创建套接字

语法

af:地址族 ip地址类型-ipv4

type:socket类型-用户数据报

protocol:传输使用的协议-UDP

工具-错误查找里面可以根据返回的错误码查找相关错误

//创建套接字
 SOCKET sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
 if(INVALID_SOCKET==sock){
     cout<<"socket error"<<WSAGetLastError()<<endl;
     WSACleanup();
     return 1;
 }else{
     cout<<"socket success"<<endl;
 }

绑定网卡和端口号

告诉操作系统,当前进程使用的是什么类型的ip地址,哪个端口号,哪个ip

语法

[in] s

标识未绑定套接字的描述符。

绑定socket:该进程使用该socket的ip地址端口号用于接收,发送数据。

一个进程可以绑定多个socket。

[in] name

指向要分配给绑定套接字 的本地地址 的 sockaddr 结构的指针。

下面的 sockaddr 结构和sockaddr_in结构用于 IPv4。 其他协议使用类似的结构。

struct sockaddr {
         ushort  sa_family;
         char    sa_data[14];//数据顺序需要自己排列,比较麻烦
 };
 //这两个结构体的大小相同,内容相同,可以进行强转,不会丢失数据
 struct sockaddr_in {
         short   sin_family;
         u_short sin_port;
         struct  in_addr sin_addr;
         char    sin_zero[8];
 };

使用sockaddr_in更便于赋值。

struct in_addr sin_addr;//结构体套联合体

struct in_addr {
   union {
     struct {
       u_char s_b1;
       u_char s_b2;
       u_char s_b3;
       u_char s_b4;
     } S_un_b;
     struct {
       u_short s_w1;
       u_short s_w2;
     } S_un_w;
     u_long S_addr;
   } S_un;
 };

[in] namelen

name 参数指向的值的长度(以字节为单位)。通过指针,不能指定指针指向的空间大小。通过明确指针空间大小,可以避免指针越界。

返回值

如果未发生错误, 绑定 将返回零。 否则,它将返回SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

//给结构体赋值
sockaddr_in addr;
addr.sin_family=AF_INET;
//数字大的端口号无人使用 涉及大小端问题 规定网络字节序 htons 转换成大端
addr.sin_port=htons(6666);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
err=bind(sock,(sockaddr*)&addr,sizeof(addr));//指针和指针才可以强转
if(SOCKET_ERROR==err){
    cout<<"bind error"<<WSAGetLastError()<<endl;
    //关闭套接字
    closesocket();
    //卸载库
    WSACleanup();
    return 1;
}else{
    cout<<"bind success"<<endl;
}

发送接收数据

接收数据

int WSAAPI recvfrom(
  [in]                SOCKET   s,//本进程使用的套接字
  [out]               char     *buf,//数据接收从哪个地址开始
  [in]                int      len,//可接收的数据大小
  [in]                int      flags,//初始化标志位-0-默认方式接收
  [out]               sockaddr *from,//接收到的数据的来源地址
  [in, out, optional] int      *fromlen//地址的长度存储的位置
);

参数

[in] s

标识绑定套接字的描述符。

[out] buf

传入数据的缓冲区。

[in] len

buf 参数指向的缓冲区的长度(以字节为单位)。

[in] flags

一组选项,用于修改函数调用的行为,超出为关联套接字指定的选项。

[out] from

指向 sockaddr 结构中的缓冲区的可选指针,该缓冲区将在返回时保存源地址。

[in, out, optional] fromlen

指向 from 参数指向的缓冲区大小(以字节为单位)的可选指针。

返回值

如果未发生错误, recvfrom 将返回收到的字节数。 如果连接已正常关闭,则返回值为零。 否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

int recvNum=0;
int sendNum=0;
char recvBuf[9999]="";
char sendBuf[9999]="";
sockaddr_in addrClient;
int addrClientSize=sizeof(addrClient);
while(true){
    
    recvNum=recvfrom(sock,recvBuf,sizeof(recvBuf),0,(sockaddr*)&addrClient,&addrClientSize);
    if(recvNum>0){
        cout<<"ip"<<inet_ntoa(addrcClient.sin_addr)<<"say:"<<recvBuf<<endl;
    }else{
        cout<<"recv error"<<WSAGetLastError()<<endl;
        break;
    }
    //发送数据
    gets(sendBuf);
    sendNum=sendto(sock,sendBuf,sizeof(sendBuf),0,(sockaddr*)&addrClient,addrClientSize);
    if(SOCKET_ERROR==sendNum){
        cout<<"send error"<<WSAGetLastError()<<endl;
        break;
    }else{
        cout<<"send success"<<endl;
    }
}

closesocket(sock);
WSACleanup();

return 0;

发送数据

sendto 语法

int WSAAPI sendto(
  [in] SOCKET         s,//发送使用的socket
  [in] const char     *buf,//从哪个地址开始写入数据
  [in] int            len,//可使用的空间大小
  [in] int            flags,//使用的接收方式
  [in] const sockaddr *to,//发送给哪个ip地址所在的位置
  [in] int            tolen//该IP地址所占的长度
);

参数

[in] s

标识可能连接的 () 套接字的描述符。使用的套接字。

[in] buf

指向包含要传输的数据的缓冲区的指针。

[in] len

buf 参数指向的数据的长度(以字节为单位)。

[in] flags

一组指定调用方式的标志。0-最简单的接收方式。

[in] to

指向包含目标套接字地址 的 sockaddr 结构的可选指针。

[in] tolen

由 to 参数指向的地址的大小(以字节为单位)。

返回值

如果未发生错误, sendto 将返回发送的总字节数,这可能小于 len 指示的数量。 否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 检索特定的错误代码。

地址形式转换

IP地址分类:

  1. 字符串类型 十进制四等分类型“192.168.3.222”,方便用户查看。
  2. ulong类型可存储更长的数据。

两种地址转换

字符串->ulong

  1. inet_addr();

ulong->字符串

  1. inet_ntoa();//实际上是in_addr转字符串

完整代码

#include<iostream>
//头文件不在当前解决方案<> 在当前解决方案" "
#include<winsock2.h >
//导入依赖库
#pragma comment(lib,"Ws2_32.lib")//立即导入 lib-library
using namespace std;

int main()
{
	//1.加载库(使用库函数)/静态库 添加头文件,导入依赖库(lib+库名)
	
	// 加载库相当于把exe拷入到
	//动态库 添加头文件,导入依赖库 动态库dll和exe放在一起然后才能用
	//W-windows S-socket A-api Windows里面关于Socket的一个接口
	WORD version = MAKEWORD(2, 2);//输入参数需要赋值
	WSADATA data;//输出参数不需要赋值
	int err = WSAStartup(version,&data);//未定义标识符 没有导入库
	//实现在库里面实现 除了需要引用头文件,还需要导入依赖库
	
	//函数参数填完了需要判断返回值
	//判断函数调用是否成功 成功就继续,失败就停止 return
	if(0!=err){
		cout << "WSAStartup error" << endl;
		return 1;
	}

	//判断库的版本号对不对
	//函数调用成功了但是库的版本号可能不对,因此需要判断版本号是否正确
	if (2 != HIBYTE(data.wVersion) || 2 != LOBYTE(data.wVersion)) {
		cout << "WSAStartup version error " << endl;
		//卸载库
		WSACleanup();
		return 1;
	}
	else {
		cout << "WSAStartup success" << endl;
	}


	//2.创建套接字(通信的基石,得先有套接字后面才能用)

	SOCKET sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (INVALID_SOCKET == sock) {
		cout << "socket error" << "  " << WSAGetLastError() << endl;
		//卸载库
		WSACleanup();
		return 1;
	}
	else {
		cout << "socket succuss" << endl;
	}

	//3.绑定网卡和端口号,(告诉系统可以接收发给哪个网卡和端口号的数据)
	//告诉操作系统,当前进程使用的是什么类型的ip地址,哪个端口号,哪个ip
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(67890);//数字大的端口号无人使用//端口 涉及大小端问题 规定网络字节序 转换成大端
	addr.sin_addr.S_un.S_addr = INADDR_ANY;//地址 绑定任意(所有)网卡 
	//ip地址分两种类型:字符串类型 十进制四等分类型"192.168.3.222"(方便用户看) ulong类型(更长)
	//两种类型相互转换 字符串类型转 ulong: inet_addr()
	//ulong转字符串: inet_ntoa() 实际上是in_addr转字符串
	err=bind(sock, (sockaddr*)&addr, sizeof(addr));//指针和指针才能强转
	if (SOCKET_ERROR == err) {
		cout << "bind error" << WSAGetLastError() << endl;//只有网络操作的时候WSAGetLastError可用
		closesocket(sock);//一个进程可以有多个套接字,需要指定关闭哪个套接字
		WSACleanup();
		return 1;
	}
	else {
		cout << "bind success" << endl;
	}
	//传输数据:发送和接收数据,是一个循环
	//先接收数据的是服务端

	int nRecvNum = 0;//局部变量定义在循环的外面 提高效率 避免反复的申请空间
	//减少申请空间的时间
	int nSendNum = 0;
	char recvBuf[9999] = "";
	char sendBuf[9999] = "";
	sockaddr_in addrClient;
	int addrClientSize = sizeof(addrClient);
	while (true) {
		//4.接收数据(阻塞函数 有一步再进行下一步)
		//接收使用的套,接收到的数据,数据的大小,接收的方式,接收方的地址,地址的长度
		nRecvNum=recvfrom(sock,recvBuf,sizeof(recvBuf),0,(sockaddr*)&addrClient,&addrClientSize);
		if (nRecvNum > 0) {
			//打印接收到的数据 接收的ip地址ulong转char
			cout << "ip:"<< inet_ntoa(addrClient.sin_addr)<<" say:" << recvBuf << endl;
		}
		else {
			cout << "recv error" << WSAGetLastError() << endl;
			break;
		}
		//5.发送数据
		gets_s(sendBuf);
		nSendNum=sendto(sock,sendBuf,sizeof(sendBuf),0,(sockaddr*)&addrClient,addrClientSize);
		if (SOCKET_ERROR==nSendNum) {
			cout << "send error" << WSAGetLastError() << endl;
			break;

		}
		else{
			cout << "send success" << endl;
		}
	}
	//6.关闭套接字
	closesocket(sock);

	//8.卸载库
	WSACleanup();


	return 0;
	//inet_nota 函数太老系统不适配,关闭SDL 安全检查
}

完整代码2

#include<iostream>
#include<winsock2.h>
using namespace std;
#pragma comment(lib,"Ws2_32.lib")
int main() {
//1 加载库
	WORD version = MAKEWORD(2, 2);
	WSADATA data;
	int err=WSAStartup(version,&data);
	if (0 != err) {
		cout << "WSAStartup err" << endl;
		return 1;
	}
	else {
		cout << "WSASTartup success" << endl;
	}
	if (2 != HIBYTE(data.wVersion) || 2 != LOBYTE(data.wVersion)) {
		cout << "Version err" << endl;
		WSACleanup();
		return 1;
	}
	else {
		cout << "Version right" << endl;
	}
//2创建套接字
	SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	if (INVALID_SOCKET == sock) {
		cout << "socket err " << WSAGetLastError()<<endl;
		WSACleanup();
		return 1;
	}
	else {
		cout << "socket success" << endl;
	}
	sockaddr_in addr;
	addr.sin_addr.S_un.S_addr = INADDR_ANY;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(56789);
	err = bind(sock,(sockaddr*)&addr,sizeof(addr));
	if (SOCKET_ERROR == err) {
		cout << "bind error" << GetLastError() << endl;
		closesocket(sock);
		WSACleanup();
		return 1;
	}else{
		cout << "bind success" << endl;
	
	}
	char sendBuf[9999] = "";
	char recvBuf[9999] = "";
	int sendBuflen = sizeof(sendBuf);
	int recvBufsize = sizeof(recvBuf);
	sockaddr_in addrTo;
	int addrToLen = sizeof(addrTo);
	while (true) {
		//3循环接受数据
		int recvNum = recvfrom(sock,recvBuf,recvBufsize,0,(sockaddr*)&addrTo,&addrToLen);
		if (recvNum<0) {
			cout << "recvv erro" << WSAGetLastError() << endl;
			break;
		}
		else {
			cout << "ip:" << inet_ntoa(addrTo.sin_addr) << "  say:" <<recvBuf<< endl;
		}
	//4发送数据
		gets_s(sendBuf);
		int sendNum = sendto(sock, sendBuf, sendBuflen, 0, (sockaddr*)&addrTo, sizeof(addrTo));
		if (SOCKET_ERROR == sendNum) {
			cout << "send error" << WSAGetLastError() << endl;
			break;
		}
		else {
			cout << "send success" << endl;
		}
	}



//5关闭套接字
	WSACleanup();
//6卸载库
	closesocket(sock);

}
【网络】UDP网络服务器 ​ 作为一款服务器:要有自己的服务端口号uint16_t_port,同时网络服务器需要有对应的string _ip地址,文件描述符_sockfd:进行各种各样的数据通信,在类内进行读写操作。对于ip地址的类型:字符串型只在我们用户层作为参数传递,传递的IP格式为" 127.0.0.1 "这种格式的IP称之为“点分十进制"IP,这样的IP是字符串,可读性高,但是仅仅在我们用户层使用,但是在网络通信的过程中IP是需要转换为 uint32_t 类型,这时候需要调用相关的接口转换为网络通信使用的的IP风格。 阅读详情

相关推荐

UDP服务器

传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。 相较于TCP而言,UDP通信的形式更像是发短信。不需要在数据传输之前建立、维护连接。只专心获取数据就好。省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证

化茧成蝶007 700

UDP server 和UDP client说明

UDP client ,是指模块通电后监听设置的端口,不主动建立链接,当串口设备向模块串口发送数据时,串口服务器 将数据发送到设定的目标IP和端口上,PC端可以将目标IP和端口设置为模块的自身IP模块的自身端口,然后PC端发送数据,可以将数据发送到模块的串口端。在此模式下,模块默认记录一个目标IP,当串口有数据时,向记录的IP发送数据,同时,模块处于服务器的地位,接收网络中发给模块的数据包,并随时调整目标IP为数据来源的IP,适合于多个IP对应模块的工作方式。

Random南荞的博客 2465

UDP SERVER

UDP SERVER

学习 496

简单的UDP网络程序(后端服务器)

简单的UDP网络程序

weixin_67595436的博客 2139

手把手教你用CEFSharp打造防关联指纹浏览器(附完整代码)

本文详细介绍了如何基于CEFSharp框架,从零开始构建一个企业级的防关联指纹浏览器。通过剖析核心架构、多进程隔离实现、动态指纹混淆(如Canvas、WebGL)的实战代码,以及代理集成与性能优化,为跨境电商、广告投放等场景提供了一套可控、安全的开源解决方案。

fern8的博客 963

半监督的医学分割数据集(LA, Pancreas, ACDC和PROMISE12)分享

这篇文章提供了四个常用的半监督医学分割数据集,所有数据集都已经被处理成了.h5文件。下载之后就可以直接使用

qq_45691955的博客 4179

Linux Socket编程 -- UDP Server 与 Client

UDP simple server

wxfx_OT的博客 1945

Kylin-Desktop-V10-SP1-General-Release-2303-X86_64-海光版(hygon c86)安装与配置指南

本文提供了在国产海光C86处理器平台上安装与配置Kylin Desktop V10 SP1操作系统的详细指南。内容涵盖从下载专用镜像、制作启动盘、BIOS关键设置、磁盘分区方案,到系统安装后的驱动优化、必备软件安装及常见故障排除,旨在帮助用户顺利完成hygon c86平台的系统部署与优化。

tree的博客 1375

UDP Server端实现

UDP C/S模型 UDP API int socket (int domain,int type,int protocol); 此接口和TCP几乎一样,唯一不同的位置就是type里面传的值TCP传SOCK_STREAM; UDP里面SOCK_DGRAM; SOCK_STREAM:这个协议是按照顺序的,可靠的,数据完整的基于字节流的连接。这是一个使用最多的socket类型。 SOCK_DGRAM:这个协议是无连接的,固定长度的传输调用。该协议是不可靠的。 int sendto(int sockfd,co

weixin_44027052的博客 1530

电力远动入门:手把手解析IEC 60870-5-101规约的帧结构与报文交互(基于DL/T634.5101-2002)

本文深入解析IEC 60870-5-101规约的帧结构与报文交互,适用于电力远动通信系统。通过详细讲解规约的基础架构、控制域位定义及典型报文交互流程,帮助工程师快速掌握101规约的核心技术,提升电力自动化系统的调试与维护能力。

weixin_27076351的博客 245

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 346

Golang实现UDP Server

Server端 1、net.ListenUDP() 监听UDP服务 2、net.UDPConn.ReadFromUDP() 循环读取数据 3、net.UDPConn.WriteToUDP() 写数据 package main import ( "fmt" "log" "net" ) func main() { // 监听UDP服务 udpConn,err := net.ListenUDP("udp",&net.UDPAddr{ IP: ne..

qq_38473097的博客 1067

实战分享:如何用Jetson Nano+HM30图传搭建低空YOLOv5检测系统(附VNC避坑指南)

本文详细介绍了如何利用Jetson Nano和HM30图传搭建低空YOLOv5检测系统,重点解决了无人机应用中的硬件连接和VNC延迟优化问题。通过对比WiFi直连与图传方案的优劣,提供了网络配置、VNC优化及YOLOv5模型加速的实战技巧,帮助开发者实现高效稳定的低空目标检测系统。

weixin_29174385的博客 110

udp 简单server和client

server.cpp #include <sys/types.h> #include <sys/socket.h> #include <pthread.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib..

m0_37981386的博客 1854

深入浅出AXI协议(2)——通道及信号

本文我们继续AXI协议的学习,我们将讨论5个通道的具体内容和相对应的信号。这一部分的内容现在对于大家来说可能很难理解,但是没有关系,随着学习的深入,我们会逐步讲解这里面的所有现在,现在只需要把它们当作一个可以查阅的手册,快速阅读有一个基本的印象即可。

apple_53311083的博客 1799

华为OD机试 - 最佳对手(Python/JS/C/C++ 2025 A卷 200分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。给定n个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距d内,则可以匹配。要求在匹配队伍最多的情况下,匹配出的各组实力差

学Java,找哪吒 1379

UDP Server、UDP Client 和 UDP Broadcast 简介

UDP 是一种面向无连接的协议,适合于低延迟、高性能的网络通信。相比 TCP,UDP 的特点是速度快但不保证可靠性,常用于实时传输场景(如视频、音频、广播)。UDP 广播是一种特殊的 UDP 通信方式,可以向一个子网内的所有设备发送消息。UDP Server 是被动接收数据的角色,通常用于接收来自 UDP Client 的请求。UDP 适合低延迟场景,但需要根据应用需求补充可靠性机制(如超时重传、序列号等)。UDP Client 主动向 Server 发送数据,通常用于发送请求或消息。

m0_63482948的博客 1634

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python UDP Server Client

Python 一个简单udp 的server 与 Client 例子,需要server 先启动,client 后启动. # -*- coding: cp936 udp Server 先启动 -*- zdt import socket,time import random Lport = 8013 Rport = 8012 host = "localhost" s = socket.

最开心的就是>>种豆得豆,种瓜的瓜>> 952

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

UDP Server/Client

UDP是无连接,不可靠的传输。但是怎么又会有Server/Client的说法呢?请看红色字体的解释。 UDP Server程序 编写程序 (1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。 (2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义: struct sockaddr_in {

$firecat利白的代码足迹$ 2954

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Linux网络编程】UDP Echo Server的实现

IP地址+端口号。

2401_82677021的博客 2233

编写Linux下的UDP Client/Server程序

一、引言UDP是TCP/IP协议中的传输层协议的一种,本文介绍了在Linux下编写基于UDP协议的Client/Server模型的程序的方法,并给出了一个echo Client/Server例子程序。二、UDP协议简介UDP是一种简单的传输层协议,在RFC768中有详细描述。UDP协议是一种非连接的、不可靠的数据报文协议,完全不同于提供面向连接的、可靠的字节流的TCP协议。虽然UD

james@BJ的专栏 7284

【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序

我们之前讲解了关于socket编程的一些基础知识和接口函数,今天我们就来小试牛刀一下,自己编写一个简单的echo_server程序,将客户端的数据在服务端打印出来(利用udp协议实现)!

可涵的博客 6220

Linux网络编程:UDP 的echo server

本文介绍了如何使用UDP协议实现简单的服务端与客户端通信。首先讲解了服务端实现步骤:创建socket套接字、绑定地址信息,以及启动循环接收消息并回显的echo服务。客户端实现类似,但不需要显式bind,而是由系统自动分配端口。代码展示了完整的UDP通信流程,包括socket创建、地址绑定、数据收发等核心操作,并提供了日志记录和错误处理。通过这个示例,读者可以初步了解网络编程的基本模式,为后续深入学习更复杂的网络协议和应用打下基础。

htw250056的博客 1173

Linux Kernel存储udp server的socket信息跟踪

前言 工作中遇到一个内核的bug,同事给内核增加了socket绑定设备接口id的功能,主要用在绑定VRF的时候,绑定特定的设备。最近测试发现了,加了这个补丁后,导致不同vlan的dhcp server不能同时工作,为了解决这个问题,我对linux kernel如何存储socket的相关功能进行了跟踪,记录如下。 应用层UDP Server创建 应用层调用socket, bind创建udp server socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); bind(sock

钱国正的专栏 646
上一篇: UDP-阻塞与非阻塞
下一篇: UDP_Client
小姨火辣辣
博客等级 码龄4年 38粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值