本地UDP通信详解-linux-Linux-Socket-socket本地UDP (本地udp通信可靠吗)

教程大全 2025-07-09 05:39:14 浏览

在日常开发过程中,我们常常需要进行进程间通信。其中,网络通信是最常用的一种方式。而在网络通信中,UDP协议被广泛使用。本文将详细介绍在Linux环境下,如何使用UDP协议进行本地通信。

一、UDP协议简介

UDP(User>服务器,所以在通信时,要先确定好通信的双方的IP地址和端口号。UDP相对于TCP更加轻量级,传输效率更高,但是其不具有可靠性。数据报文可能会丢失、重复、乱序等,这些问题需要应用程序自行处理。

二、UDP协议的优缺点

1. 优点

(1)传输效率:UDP使用无连接传输,不需要建立和断开连接,数据报文的传输效率高;

(2)适合数据量小的传输:由于UDP协议没有包头和包尾,因此数据报文更加紧凑,适合传输数据量小的信息。

2. 缺点

(1)不可靠:UDP协议不提供可靠性,数据报文可能丢失、重复、乱序等;

(2)应用程序自行处理:UDP协议不提供顺序控制和重传机制,这些问题需要应用程序自行处理;

(3)难以控制拥塞:UDP协议不提供拥塞控制机制,对网络带宽的利用率不够高。

三、UDP协议的使用

1. 创建Socket

要使用UDP协议进行本地通信,首先需要创建Socket。Socket是应用程序和网络之间的一个接口,它是数据传输的通道。

int fd = socket(AF_INET, SOCK_DGRAM, 0);

其中,之一个参数AF_INET表示要使用IPv4协议,第二个参数SOCK_DGRAM表示要使用UDP协议,第三个参数0表示由系统自动选择使用的协议。

2. 绑定IP和端口号

要进行本地通信,需要将本地的IP和端口号与Socket绑定。

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(8888);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(fd, (struct sockaddr*)&addr, sizeof(addr));

其中,之一个参数fd是Socket的文件描述符,第二个参数是一个指向sockaddr_in结构体的指针,用于存储绑定的IP和端口号,第三个参数用于指定sockaddr_in结构体的大小。

3. 发送数据报文

要发送数据报文,需要指定目标IP地址和端口号,将数据写入Socket。

struct sockaddr_in dest_addr;

dest_addr.sin_family = AF_INET;

dest_addr.sin_port = htons(8888);

inet_pton(AF_INET, “127.0.0.1”, &dest_addr.sin_addr);

sendto(fd, buf, len, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));

其中,之一个参数fd是Socket的文件描述符,第二个参数buf是要发送的数据缓冲区,第三个参数len是要发送的数据长度,第四个参数0表示不需要特殊的控制,第五个参数是一个指向sockaddr_in结构体的指针,用于指定目标IP地址和端口号,第六个参数用于指定sockaddr_in结构体的大小。

4. 接收数据报文

要接收数据报文,需要先创建缓冲区,然后等待接收数据。

char buf[1024];

struct sockaddr_in src_addr;

socklen_t src_len = sizeof(src_addr);

recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&src_addr, &src_len);

其中,之一个参数fd是Socket的文件描述符,第二个参数buf是用于接收数据的缓冲区,第三个参数sizeof(buf)表示缓冲区的大小,第四个参数0表示不需要特殊的控制,第五个参数是一个指向sockaddr_in结构体的指针,用于存储发送数据报文方的IP和端口号,第六个参数用于指定sockaddr_in结构体的大小。

四、

本文详细介绍了在Linux环境下,如何使用UDP协议进行本地通信。UDP协议是一种无连接的协议,传输效率高,适合传输数据量小的信息。但由于其不提供可靠性和拥塞控制机制,需要应用程序自行处理。

在使用UDP协议进行本地通信时,需要创建Socket,绑定IP和端口号,发送数据报文和接收数据报文。在发送和接收数据报文时,需要指定目标IP地址和端口号,以及缓冲区大小。这些细节需要开发人员掌握,才能顺利地进行本地通信。

相关问题拓展阅读:

UDP和Socket通信步骤

这是在网上找到的,希望对你有所帮助。

sockets(套接数神字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);

WINDOWS环境下TCP/UDP编程步骤:

1. 基于裤毕岩TCP的socket编程是采用的流式套接字。

在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

void main()

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf;

sprintf(sendBuf,”Welcome %s to here!”,inet_ntoa(addrClient.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf;

recv(sockConn,recvBuf,50,0);

printf(“%s\n”,recvBuf);

closesocket(sockConn);

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出胡御连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端的代码如下:

void main()

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf;

recv(sockClient,recvBuf,50,0);

printf(“%s\n”,recvBuf);

send(sockClient,”hello”,strlen(“hello”)+1,0);

closesocket(sockClient);

WSACleanup();

2.基于UDP的socket编程是采用的数据报套接字。

在这个程序中,将两个工程添加到一个工作区。同时还要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:等待和接收数据(sendto()/recvfrom());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

void main()

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 )

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 )

WSACleanup( );

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(7003);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf;

SOCKADDR addrClient;

int len=sizeof(SOCKADDR);

recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);

printf(“%s\n”,recvBuf);

closesocket(sockSrv);

WSACleanup();

对于基于UDP的socket客户端来说,要进行如下步骤:

1:创建一个套接字(socket);

2:向服务器发送数据(sendto);

3:关闭套接字;

代码如下:

void main()

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

if ( LOBYTE( wsaData.wVersion ) != 2 ||

HIBYTE( wsaData.wVersion ) != 2 ) {

WSACleanup( );

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrClient;

addrClient.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);

addrClient.sin_family=AF_INET;

addrClient.sin_port=htons(8889);

SOCKADDR_IN addrSrv;

sendto(sockClient,”hi”,3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));

LINUX环境下TCP/UDP编程步骤:

TCP编程步骤:

一. 服务端:

1.socket(int domain,int type,int protocol):建立套接字;

2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):把本机地址和端口跟上一步建立的socket绑定在一起;

3.listen(int sockid,int qsize):监听某套接字;

4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):等待某套接字接收信息;

5.recv(int fd,void *buf,size_t nbytes,int flags):从套接字接收数据;

6.close(fd) 和close(sockid)

二.客户端:

1. socket():建立套接字;

2.connect(int sockid,struct sockaddr *serv_addrp,socklen_t addrlen):连接到服务器;

3. send(int sockfd,const void *buf,size_t nbytes,int flags):发送数据到服务器.

4. close(sockid);

UDP编程步骤:

一,服务端:

1. socket():同上;

2. bind():同上;

4. close(sockfd);

二. 客户端:

1. socket();同上;

2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址发送数据;

3. close(sockfd);

UDP Server程序

1、编写UDP Server程序的步骤

(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。

(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:

struct sockaddr_in {

uint8_t sin_len;

sa_family_t sin_family;

in_port_t sin_port;

struct in_addr sin_addr;

char sin_zero;

这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为姿凯绑定的IP地址即任何主机上的地址。

(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。

(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。

2、udpserv.c程序内容:

#define MAXLINE 80

#define SERV_PORT 8888

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)

socklen_t len;

len = clilen;

/* waiting for receive>香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


socket本地UDP

局域网共享需要密码,如何去掉?

Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Lsa]restrictanonymous=dword[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]restrictanonymous=dword; 以上两行在系统中的位置是:本地安全策略-安全选项-网络访问:不允许SAM帐户和共享; 的匿名枚举。 系统默认值是:已停用。 ; 解说:操作系统默认:利用ipc$通道可以建立空连接,匿名枚举出该机有多少帐户。 显然; 有一定的安全隐患。 本系统已设为不允许空连接了。 以此提高单机拨号上网的安全性。 ; 负面影响是局域网不能互访了。 要更改一下才可以解决。 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]limitblankpassworduse=dword[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Lsa]limitblankpassworduse=dword; 以上两行在系统中的位置是:本地安全策略--安全选项--帐户:使用空白密码的本地帐户; 只允许进行控制台登录。 系统默认值是:已启用。 ; 解说:很多人的帐户是不加密码的。 这样,当局域网中别的电脑访问本机时,会弹出错误提示:; 登录失败:用户帐户限制………。 这是XP系统的一条安全策略造成的,防止别人趁你空密码时; 进入你的电脑。 如果你觉得无所谓,不必做这些限制,那就把它设为:已停用。 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{-EF1F-11D0-9888-DEACF9}\Count]HRZR_EHAPCY=hex:0C,00,00,00,26,00,00,00,F0,FB,E5,52,64,95,C6,01HRZR_EHAPCY:P:\JVAQBJF\flfgrz32\,Jvaqbjf 防火墙=hex:0C,00,00,00,08,00,00,00,F0,FB,E5,52,64,95,C6,01[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\GloballyOpenPorts\List]445:TCP=,-:UDP=,-:UDP=,-:TCP=,-[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Epoch]Epoch=dwordED[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Providers]LogonTime=hex:E8,31,8E,4F,64,95,C6,01[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\GloballyOpenPorts\List]445:TCP=,-:UDP=,-:UDP=,-:TCP=,-[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Epoch]Epoch=dwordED; 以上数值对应系统中的位置:控制面板--防火墙--例外--文件和打印机共享。 系统默认:不选。 ; 解说:所有的策略都设置好了,局域网依然不能访问,提示:您没有权限使用网络资源,找; 不到网络路径!呵呵,真是令人火冒三丈!其实XP还有一道关卡,就是防火墙,必须要经过; 防火墙的允许才行。 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]forceguest=dword; 以上数值对应系统中的位置是:控制面板--管理工具--本地安全策略--本地策略--安全选项,; 网络访问:本地帐户的共享和安全模式:仅来宾-本地用户以来宾份验证。 这时,当局域网; 其他机访问本机时,不会弹出对话框,就可以直接进入。 在家庭网等完全可以信任的区域,; 建议使用这种方式。 新建记事本。 另存为格式。

系统配置实用程序中有那些服务用启动和有那些服务要禁用,那位有详细简明的答案

服务其实是Win 2000/XP/2003中一种特殊的应用程序类型,不过它是在后台运行,所以我们在任务管理器看不到它。 安装Win XP后,通常系统会默认启动许多服务,其中有些服务是普通用户根本用不到的,不但占用系统资源,还有可能被黑客所利用。 查看正在启用的服务项目以Win XP为例,首先你要使用系统管理员账户或以拥有Administrator权限的用户身份登录,然后在“运行”中输入“”打开命令行窗口,再输入“net start”回车后,就会显示出系统正在运行的服务为了更详细地查看各项服务的信息,我们可以在“开始→控制面板→管理工具”中双击“服务”,或者直接在“运行”中输入“”打开服务设置窗口关闭、禁止与重新启用服务服务分为三种启动类型:1.自动:如果一些无用服务被设置为自动,它就会随机器一起启动,这样会延长系统启动时间。 通常与系统有紧密关联的服务才必须设置为自动。 2.手动:只有在需要它的时候,才会被启动。 3.已禁用:表示这种服务将不再启动,即使是在需要它时,也不会被启动,除非修改为上面两种类型。 如果我们要关闭正在运行的服务,只要选中它,然后在右键菜单中选择“停止”即可。 但是下次启动机器时,它还可能自动或手动运行。 如果服务项目确实无用,可以选择禁止服务。 在右键菜单中选择“属性”,然后在“常规→启动类型”列表中选择“已禁用”,这项服务就会被彻底禁用。 如果以后需要重新起用它,只要在此选择“自动”或“手动”即可;也可以通过命令行“net start 服务名”来启动,比如“net start Clipbook”。 必须禁止的服务 Remote Desktop Sharing:允许受权的用户通过NetMeeting在网络上互相访问对方。 这项服务对大多数个人用户并没有多大用处,况且服务的开启还会带来安全问题,因为上网时该服务会把用户名以明文形式发送到连接它的客户端,黑客的嗅探程序很容易就能探测到这些账户信息。 Plug and Play Device Host:此服务是为通用的即插即用设备提供支持。 这项服务存在一个安全漏洞,运行此服务的计算机很容易受到攻击。 攻击者只要向某个拥有多台Win XP系统的网络发送一个虚假的UDP包,就可能会造成这些Win XP主机对指定的主机进行攻击(DDoS)。 另外如果向该系统1900端口发送一个UDP包,令“本地”域的地址指向另一系统的chargen端口,就有可能使系统陷入一个死循环,消耗掉系统的所有资源(需要安装硬件时需手动开启)。 :俗称信使服务,电脑用户在局域网内可以利用它进行资料交换(传输客户端和服务器之间的Net Send和Alerter服务消息,此服务与Windows Messenger无关。 如果服务停止,Alerter消息不会被传输)。 这是一个危险而讨厌的服务,Messenger服务基本上是用在企业的网络管理上,但是垃圾邮件和垃圾广告厂商,也经常利用该服务发布弹出式广告,标题为“信使服务”。 而且这项服务有漏洞,MSBlast和Slammer病毒就是用它来进行快速传播的。 Services:允许多位用户连接并控制一台机器,并且在远程计算机上显示桌面和应用程序。 如果你不使用Win XP的远程控制功能,可以禁止它。 Registry:使远程用户能修改此计算机上的注册表设置。 注册表可以说是系统的核心内容,一般用户都不建议自行更改,更何况要让别人远程修改,所以这项服务是极其危险的。 User Switching Compatibility:在多用户下为需要协助的应用程序提供管理。 Windows XP允许在一台电脑上进行多用户之间的快速切换,但是这项功能有个漏洞,当你点击“开始→注销→快速切换”,在传统登录方式下重复输入一个用户名进行登录时,系统会认为是暴力破解,而锁定所有非管理员账户。 如果不经常使用,可以禁止该服务。 或者在“控制面板→用户账户→更改用户登录或注销方式”中取消“使用快速用户切换”。 :允许远程用户登录到此计算机并运行程序,并支持多种 TCP/IP Telnet客户,包括基于 UNIX 和 Windows 的计算机。 又一个危险的服务,如果启动,远程用户就可以登录、访问本地的程序,甚至可以用它来修改你的ADSL Modem等的网络设置。 除非你是网络专业人员或电脑不作为服务器使用,否则一定要禁止它。 Logs And Alerts:收集本地或远程计算机基于预先配置的日程参数的性能数据,然后将此数据写入日志或触发警报。 为了防止被远程计算机搜索数据,坚决禁止它。 Desktop Help Session Manager:如果此服务被终止,远程协助将不可用。 /IP NetBIOS Helper:NetBIOS在Win 9X下就经常有人用它来进行攻击,对于不需要文件和打印共享的用户,此项也可以禁用。 可以禁止的服务以上十项服务是对安全威胁较大的服务,普通用户一定要禁用它。 另外还有一些普通用户可以按需求禁止的服务:通知所选用户和计算机有关系统管理级警报。 如果你未连上局域网且不需要管理警报,则可将其禁止。 Service:本地和远程计算机上文件的索引内容和属性,提供文件快速访问。 这项服务对个人用户没有多大用处。 Layer Gateway Service:为Internet连接共享和Internet连接防火墙提供第三方协议插件的支持。 如果你没有启用Internet连接共享或Windows XP的内置防火墙,可以禁止该服务。 Power Supply:管理连接到计算机的不间断电源,没有安装UPS的用户可以禁用。 Spooler:将文件加载到内存中以便稍后打印。 如果没装打印机,可以禁用。 Card:管理计算机对智能卡的读取访问。 基本上用不上,可以禁用。 Discovery Service:启动家庭网络上的upnp设备自动发现。 具有upnp的设备还不多,对于我们来说这个服务是没有用的。 更新s:自动从Windows 更新网络更新补丁。 利用Windows 更新功能进行升级,速度太慢,建议大家通过多线程下载工具下载补丁到本地硬盘后,再进行升级。 :启用“剪贴板查看器”储存信息并与远程计算机共享。 如果不想与远程计算机进行信息共享,就可以禁止。 Cd-burning Com Service:用Imapi管理CD录制,虽然Win XP中内置了此功能,但是我们大多会选择专业刻录软件,另外如果没有安装刻录机的话,也可以禁止该服务。 :创建和维护到远程服务的客户端网络连接。 如果服务停止,这些连接都将不可用。 Reporting Service:服务和应用程序在非标准环境下运行时,允许错误报告。 如果你不是专业人员,这个错误报告对你来说根本没用。 再就是如下几种服务对普通用户而言也没有什么作用,大家可以自己决定取舍,如:Routing and Remote Access、Net Logon、Network DDE和Network DDE DSDM。

UDP是什么意思?

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。 它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。 比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。 例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。 大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。 这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。 正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。 QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐