Linux网络编程——udp套接字

本章Gitee地址:udp套接字

创建套接字

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
  • int domain参数:表面要创建套接字的域

    Name                Purpose                          Man page
    AF_UNIX, AF_LOCAL   Local communication              unix(7)
    AF_INET             IPv4 Internet protocols          ip(7)
    AF_INET6            IPv6 Internet protocols          ipv6(7)
    AF_IPX              IPX - Novell protocols
    AF_NETLINK          Kernel user interface device     netlink(7)
    AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
    AF_AX25             Amateur radio AX.25 protocol
    AF_ATMPVC           Access to raw ATM PVCs
    AF_APPLETALK        Appletalk                        ddp(7)
    AF_PACKET           Low level packet interface       packet(7)
    

    我们网络通信一般是采用IPv4,即AF_INET

  • int type参数:定义的套接字类型

    image-20240130142647807

    Upd采用SOCK_DGRAMTcp采用SOCK_STREAM

  • int protocol参数:协议类型

    本次这里直接填0

  • 返回值:

    image-20240130143234071

    这里创建套接字成功之后返回新套接字的文件描述符,这本质上也是一个文件

绑定端口号

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
  • int sockfd参数:创建套接字的返回值

  • const struct sockaddr *addr参数:网络通信,使用struct sockaddr_in进行强转,需包含头文件netinet/in.h

  • socklen_t addrlen参数:传过来结构体大小

  • 返回值

    image-20240130162152392

    成功返回0,失败返回-1

读取数据

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

ssize_t recvfrom

  • int sockfd:指定的套接字

  • void *buf, size_t len:读到的数据放入缓冲区和需指定长度

  • int flagsupd默认设为0,阻塞方式

  • struct sockaddr *src_addr:对方的套接字信息

  • 返回值

    image-20240130163654698

    成功返回收到了多少个字节,失败返回-1

发送数据

#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

sendto,参数和发送的参数差不多


以上就是客户端的流程,需要看服务器是否跑起来,使用指令netstat -naup

-naup:能显示成数字的就显示成数字

不带n,是字符串的就是显示成字符串

aall

uudp

p:进程pid

image-20240130170110915

关于IP:

对于云服务器,是禁止直接绑定公网ip,因为主机可能不止1一个ip,如果指定了这个ip,那么这台主机就只能收到发给这个ip的信息,所以一般都是绑定IP:0,这凡是发给这台主机的数据,都能向上交付

关于端口号:

一般0~1023都是系统内定的端口号,一般都要有固定的应用层协议使用,http:80,https:443…

所以绑定的时候,尽量绑定1024+端口号

聊天框输入框

输入输出都是显示在一个终端,我们可以将输入和输出分开,模拟聊天界面的输入区域和输出区域

目录/dev/pts,里面有各个终端文件

image-20240131212248151

我们就可以尝试将上面的终端1作为输出框;终端2作为输入框

image-20240204141845240

或者建立管道也行

image-20240204142206083

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: UDP套接字编程是一种基于UDP协议的网络编程技术。UDP是一种无连接的协议,它不保证数据传输的可靠性和顺序性,但是具有传输速度快、实时性好等优点。在Python中,可以使用socket模块来实现UDP套接字编程,通过创建UDP套接字、绑定端口、发送和接收数据等操作,实现网络通信。UDP套接字编程常用于实时性要求较高的应用场景,如音视频传输、游戏等。 ### 回答2: UDP是一种无连接的协议,在网络编程中它被广泛应用于实时通讯和游戏等领域。Python语言提供了相应的库支持,使得开发者可以利用UDP套接字来实现高性能的数据传输。 UDP套接字编程主要包括创建UDP套接字、绑定端口、发送数据、接收数据和关闭套接字等步骤。 首先,我们需要在Python中创建UDP套接字,可以使用socket库下的socket()函数。该函数可以接收两个参数,第一个参数指定了IP地址族,通常采用AF_INET表示IPv4地址族,第二个参数指定了套接字类型,可以使用SOCK_DGRAM表示UDP套接字。 ``` import socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 接着,我们需要将套接字绑定到指定的端口上。可以使用bind()函数来完成该操作。bind()函数接收一个元组类型的参数,第一个参数指定了要绑定的IP地址,通常设置为本机IP地址。第二个参数指定了端口号。 ``` udp_socket.bind(('127.0.0.1', 8888)) ``` 数据的发送和接收都需要指定对方的IP地址和端口号。使用sendto()函数发送数据时,需要指定一个元组参数,第一个参数为要发送的数据,第二个参数为接收方的IP地址和端口号。 ``` udp_socket.sendto(b'Hello, World!', ('127.0.0.1', 9999)) ``` 使用recvfrom()函数接收数据时,需要指定一个整数参数,表示要接收的数据的最大长度。函数的返回值为一个元组,包含接收到的数据和对方的IP地址和端口号。 ``` data, addr = udp_socket.recvfrom(1024) print(data.decode(), addr) ``` 最后,我们需要在程序结束时关闭UDP套接字,使用close()函数即可。 ``` udp_socket.close() ``` 总的来说,Python网络编程UDP套接字编程是一种高效的数据传输方式,可以用于实时通讯和游戏等领域。开发者可以按照上述流程来利用socket库实现相应的UDP套接字编程。 ### 回答3: UDP是一种无连接的传输协议,它可以实现快速的数据传输,常用于实时性要求高的场合,例如视频直播、语音通话等。Python作为一种高级编程语言,它拥有良好的网络编程库,可以方便地进行UDP套接字编程。 Python的socket模块是实现套接字编程的核心模块。UDP套接字编程可以通过socket模块实现。下面是一个简单UDP套接字编程的例子: ```python import socket server_address = ('localhost', 10000) data = 'Hello, UDP!' sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(data.encode(), server_address) received_data, server = sock.recvfrom(4096) print(received_data.decode()) sock.close() ``` 在这个例子中,首先定义了一个服务端地址`server_address`,然后定义了要发送的数据`data`。接下来通过socket模块创建了一个UDP套接字对象`sock`,并调用`sendto()`方法将数据发送给服务端。`sendto()`方法的参数包括要发送的数据和服务端地址。当服务端接收到数据后,它会给客户端返回一个响应消息。客户端可以通过`recvfrom()`方法获取服务端返回的数据。最后,调用`close()`方法关闭套接字。 需要注意的是,在UDP套接字编程中,数据的发送和接收是非阻塞的。这意味着一旦调用`sendto()`方法或`recvfrom()`方法,程序就会立即返回,而不会等待服务端的响应。因此,UDP套接字编程需要自行处理超时、数据丢失等异常情况。 总之,Python的UDP套接字编程可以非常方便地实现快速数据传输,适用于需要处理实时性要求高的场合。开发者可以通过socket模块的UDP套接字编程接口轻松地构建自己的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加法器+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值