当前位置:   article > 正文

Linux系统编程.NO12——TCP和UDP

Linux系统编程.NO12——TCP和UDP

9.6.TCP服务

9.6.1.TCP服务流程

在这里插入图片描述
再往下就是close函数关闭套接字了。
服务端先启动,进行一系列(socket~accept)的准备工作,如果没有客户端请求,则服务器处于阻塞状态,等待请求。
客户端启动后,首先向服务器端发起连接请求,得到服务器同意后,连接建立成功,双方就可以进行通信,客户机完成通信后释放连接,关闭套接字。

9.6.2.TCP服务端流程函数

1.int socket(int domain,int type,int protocol)
函数用于申请一个套接字,domain参数是选择使用的协议簇,AF_UNIX是只能够用于单一的UNIX系统进程间通信,而AF_INET是针对internet的,用于远程主机之间通信。
type是选择具体的协议类型,SOCK_STREAM代表TCP协议,SOCK_DGRAM代表UDP协议,SOCK_RAW代表原始套接字。
protocol,当type已经确定协议为tcp或udp的时候,该参数置为0,如果type为原始套接字,则该参数用于指定协议类型。
成功返回一个套接字描述符,一定程度上套接字描述符就是文件描述符,往对方的套接字描述符中write内容,就是在给对方发消息,失败返回-1(原始套接字只能由root用户创建)
头文件是<sys/types.h><sys/socket.h>
2.int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen)
函数用于将本地地址端口等信息绑定在套接字上(使用此函数之前必须先初始化sockaddr_in结构体,初始化的时候,如果需要使用本地IP,则用INADDR_ANY代替IP,一般服务器都使用该参数)sockfd是指由socket函数返回来的套接字描述符,my_addr即一个sockaddr的指针(这里需要将初始化完成的sockaddr_in强转为sockaddr类型),addrlen是指sockaddr的长度,一般用sizeof(struct sockaddr)代替。成功返回0,失败返回-1.
头文件是<sys/types.h><sys/socket.h><arpa/inet.h>
3.int listen(int sockfd,int backlog)
功能是对bind函数绑定好的地址和端口进行监听,sockfd是由socket函数返回的套接字描述符,backlog是指请求队列大小,也就是允许客户机个数上限,缺省值为20.
头文件是<sys/socket.h>
4.int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)
函数用于准备接受客户端请求,sockfd是socket函数申请得到的套接字描述符,addr和addrlen是拿给客户端填的,服务端只需要给出正确类型的指针即可(即定义一个对应类型的指针填在这里即可)。
成功返回值非负整数,表示连接套接字描述符,失败返回-1.
头文件是<sys/types.h><sys/socket.h>

9.6.3.TCP客户端流程函数

1.int socket(int domain,int type,int protocol)
2.int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen)
函数用于客户端向服务器发起连接,使用该函数之前也必须先初始化sockaddr_in结构体。sockfd是socket函数返回的描述符。
serv_addr是用于保留服务器端的地址和端口等信息,需要指定一个sockaddr类型的参数,而且将这个参数初始化为服务器的信息,再将该参数填在此处,用于告诉客户端需要连接的IP以及端口。
addrlen是指ser_addr的长度,用sizeof(struct sockaddr_in)代替。
头文件是<sys/types.h><sys/socket.h>

9.6.4.TCP双方通信函数

1.ssize_t send(int s,const coid *buf,size_t len,int flags)
该函数用于C/S双方发送数据给对方,flags选0的时候,send函数和write函数完全一致,参数s即套接字描述符,服务器端就是服务端accept接收到的套接字,客户端就是客户端申请的套接字描述符。flags选MSG_DONTROUTE表示告诉IP协议不查找路由表。
头文件<sys/types.h><sys/socket.h>
2.ssize_t recv(int s,void *buf,size_t len,int flags)
函数用于C/S双方接收来自对方的数据,flags选0的时候,recv函数和read函数完全一致,参数s即套接字描述符,服务器端就是服务端accept接收到的套接字,客户端就是客户端申请的套接字描述符,而且在同一方进行读写时填写的套接字描述符是同一个。
flags置MSG_PEEK只查看数据,不读出数据,下一次读还能读到刚刚的数据,MSG_WAITALL等希望接受的数据字节个数到达后才返回,否则阻塞等待,除非读到文件结束符,或者接收到终端信号才会终止。
头文件<sys/types.h><sys/socket.h>

9.7.UDP服务

9.7.1.UDP服务流程

在这里插入图片描述

服务端首先完成创建并且绑定套接字的任务,然后等待接收UDP信息,接收一般使用recfrom函数,在没有客户端请求的时候,recvfrom函数是阻塞状态,一旦收到客户端信息,进程就被唤醒,一般使用sendto函数发送响应信息。
客户端调用socket函数创建一个套接字,然后使用sendto函数向服务器发送请求,使用函数recvfrom函数来接收来自服务器的响应消息。
双方都使用close撤销套接字。

9.7.2.UDP双方通信函数

1.ssize_t sendto(int s,const void *buf,size_t len,int flags,const struct sockaddr *to,socklen_t tolen)
功能是面向连接或者无连接套接字发送数据,一般用于UDP通信发送数据,参数s即套接字描述符,服务器端就是服务端accept接收到的套接字,客户端就是客户端申请的套接字描述符。
flags置0时,sendto函数和write函数基本一致,to是指对方的地址信息,tolen是指对方的地址长度。to中的内容也必须要初始化结构体,填充对方的地址信息。
flags指MSG_DONTROUTE时,如果目标为本地主机,告诉IP协议不查找路由表。
头文件是<sys/types.h><sys/socket.h>
2.ssize_t recvfrom(int s,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen)
功能是面向连接或者无连接套接字接收数据,一般用于UDP通信发送数据,参数s即套接字描述符,服务器端就是服务端accept接收到的套接字,客户端就是客户端申请的套接字描述符,而且在同一方进行读写时填写的套接字描述符是同一个。
flags置0时,sendto函数和read函数基本一致,from是对方的地址信息,fromlen是对方的地址信息长度,特殊的是这里需要一个地址(&)。
flags置MSG_PEEK只查看数据,不读出数据,下一次读还能读到刚刚的数据,MSG_WAITALL等希望接受的数据字节个数到达后才返回,否则阻塞等待,除非读到文件结束符,或者接收到终端信号才会终止。
头文件是<sys/types.h><sys/socket.h>
3.int close(sockfd)
函数用于关闭一个套接字描述符,使用该函数之后,该描述符就不能再使用了。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号