网络:套接字通信

本文介绍了网络通信中的套接字概念,包括端口号的作用、套接字在网络中的标识以及网络字节序的重要性。讲解了创建套接字、数据发送与接收、绑定地址等关键函数的使用,同时对比了TCP与UDP协议的区别,并通过实例展示了简单的TCP和UDP网络程序。

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

前面学习了经典的进程间通信IPC机制,使得同一台计算机上运行的进程可以相互通信,接下来将描述套接字网络IPC接口,进程能够使用该接口和其它进程通信。
IP地址:有两个版本 IPv4和IPv6,没有特殊说明默认为IPv4
端口号
数据链路和IP中的地址,分别指的是MAC地址和IP地址,传输层中也有类似的概念,那就是端口号,端口号用来识别同一台计算机中进行通信的不同应用程序。
特点:
(1)是一个2字节16位的整数
(2)端口号用来标识一个进程,告诉操作系统当前的这个数据要交给哪一个进程来处理
(3)IP地址+端口号能够标识网络上某一台主机的某一个进程
(4)一个端口号只能被一个进程占用
套接字:
在TCP/IP协议中,”IP+地址+TCP/UDP端口号”唯一标示网络通讯中的一个进程,IP地址+端口号”就称为socket。
网络字节序:

网络中要实现通信少不了数据的传输,所以这里就引入了网络字节序的概念。
前面学习了内存中的多字节数据相对于内存地址有大端小端之分(大端:数据的低位在高地址,高位在低地址。小端:数据的低位在低地址,高位在高地址)。网络数据流同样有大端小端之分,TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); //主机字节序转为网络字节序,long类型
uint16_t htons(uint16_t hostshort); //主机字节序为网络字节序,short类型
uint32_t ntohl(uint32_t netlong); //网络字节序转为主机字节序,long类型
uint16_t ntohs(uint16_t netshort); //网络字节序转为主机字节序,short类型

如果主机是小端字节这些函数将参数做相应的大小端转换然后返回。如果主机是大端字节,这些函数不做转换,将参数原封不动地返回。
相关函数分析:
(1)创建套接字函数socket
这里写图片描述
参数:domain表示创建socket的类型,可选类型如下
一般IPv4参数指定AF_NET
这里写图片描述
type确定套接字的类型,可选类型如下:
对于UDP协议,type参数指定为SOCK_DGRAM,表示面向数据报的协议
对于TCP协议,type参数指定为SOCK_STAREAM,表示面向流的传输协议
这里写图片描述
参数protocol表示创建的方式,通常为0表示按给定的域和套接字类型选择默认协议。
返回值:
成功返回套接字描述符,出错返回-1
(2)将套接字和地址绑定
这里写图片描述
作用:将参数sockfd和myaddr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听myaddr所描述的地址和端口号。
参数:sockfd服务器的套接字,也就是socket函数的正确返回值。
addr是socket服务器的地址内容。
虽然函数原型中结构体是sockaddr,但是IPv4选择的结构体是sockaddr_in,包括16位端口号和32位的IP地址。这里类似于mem族函数的参数是void*类型,以便接收各种类型的数据。
bind()成功返回0,失败返回-1
客户端一般不需要调用bind(),服务器也不是必须必须调用bind(),如果不调用内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。
这里写图片描述
(3)数据发送函数
这里写图片描述
参数:
sockfd:表示当前的socket的fd。
buf:待发送数据的缓冲区。
size:缓冲区的长度。
falgs:调用方式标志位,一般位0,改变flags,将会改变sendto发送的方式
addr:指向目的套接字的地址。
addrlen:所指地址的长度。
(4)数据接收函数
这里写图片描述
参数与上面函数类似
(5)listen
这里写图片描述
listen声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接等待状态。
简单的UDP网络程序
(6)accept
这里写图片描述
三次握手完成后,服务器调用accept()接收连接。
addr是一个传出参数,accept()返回时传出客户端的地址和端口号。addr为空表示不关心客户端的地址。
(6)connect
这里写图片描述
客户端需要调用connect()连接服务器
参数与bind

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值