网络套接字socket,利用UDP协议实现服务器与客户端通信

本文介绍了网络通信中的IP与端口号概念,阐述了TCP与UDP的特点,并详细解析了网络字节序。通过socket接口创建套接字,并讲解了如何绑定端口号进行通信。最后,给出了一个简单的UDP服务器与客户端实现,用于网络计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两台主机之间的通信,是通过网卡再经过网络,互相传输,那么我们先来介绍再通信中想要在全球的pc中找到你要发送数据那一台,就需要IP来标识,那么这里在数据报文中就包含了源IP和目的IP,分别标识的是数据从哪来要到那里去。

有了IP那么要怎么认识是主机的哪个进程收数据,这时就有端口号,一个端口号标识着一台主机上的唯一的进程。那么有个问题?
为什么不用PID而要用端口号?因为在一台主机或者服务器上,一个进程的pid随着系统的重启会发生变化,发生变化了,对于客户端没有什么影响,但是对于服务器,客户端就不知道访问的是哪个进程了,所以用一个传输层的端口号,这样就可以通过绑定的端口号来进行访问。

端口号:端口号是一个两个字节的整数 0 ~ 65535
端口号是用来标识一个进程
一台主机要访问另一台主机,那么就需要IP和端口号来标识一台进程
通常情况下,一个端口号只能被一个进程绑定。

TCP/UDP特点

TCP

  • 传输层协议
  • 有链接
  • 可靠传输
  • 面向字节流

UDP

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

关于网路中传输的字节序

计算机是分有大端和小端。有这个差异是因为计算机制造厂商,那么在网络中传输也就统一了字节序。
小端机,就是在低地址处存地位
大端机,是在高地址处存地位
而网络中规定为大端传输,所以就要在传输的过程中把一些数值转换成网络字节序来进行传输。
那么我们就要了解一组API

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); // 主机转网络int
uint16_t htons(uint16_t hostshort); // 主机转网络short
uint32_t ntohl(uint32_t netlong); // 网络转主机int
uint16_t ntohs(uint16_t netshort); // 网络转主机short

这里再来个linux下的命令netstat -nap 查看

socket套接字

socket套接字是TCP/IP协议族相关的API,返回值为一个文件描述符,我们先来认识socket函数接口

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

参数介绍:
domain :是协议是IPV4,还是IPV6,在当今主要还是IPV4,为4个字节,IPV6为16个字节。
type:是使用TCP还是UDP等等一些协议进行传输
protocol:用来指定socket所使用的传输协议编号。这一参数通常不具体设置,一般设置为0
返回值:
返回一个正整数,是文件描述符。通过对文件描述符的操作来进行网络上数据的传输。

前面我们说了,在网络通信中如何标识一个进程,那就是端口号,所以我们在服务器端就会绑定一个端口号,这样就可以标识出一个进程。通过端口号就可以找到对应的进程进行通信。

介绍绑定端口号API

#include <sys/socket.h>
int bind(int sock, const struct sockaddr* address,\
socklen_t address_len);

参数:
sock:为socket返回的文件描述符
address:结构体里面有IP协议,有要绑定的端口号和IP地址,这是一个通用的结构体,因为c语言没有多态,多以就用一个结构体通过强转来实现自己想要的。
address_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值