Linux网络编程——TCP&UDP编程流程(一)

TCP和UDP协议的特点

  • TCP协议:面向连接的、可靠的、字节流服务
  • UDP协议:无连接的、不可靠的、数据报服务
  • 编程方式:C/S(客户端/服务器)

TCP编程流程

TCP编程分为客户端和服务器端两个部分

  • TCP服务器端的编程流程
  1. 创建用于监听的 socket套接字: int socket();
  2. 命名创建的 socket套接字: int bind();其中包含服务器的地址信息: struct sockaddr_in;(IP地址+端口号)
  3. 创建监听队列: int listen();
  4. 获取—个客户端连接,返回连接 socket套接字: int accept();
  5. int recv();接收数据
  6. int send();发送数据
  7. int close();关闭连接
  • TCP客户端的编程流程
  1. 创建用于和服务器通信的 socket套接字: int socket();
  2. 与服务器连接: int connect();
  3. int send();发送数据
  4. int recv();接收数据
  5. int close();关闭连接
  • 当通信连接成功后,发送和接收的数据并不会立即被发送和接收,而是先存入TCP发送缓冲区和TCP接收缓冲区中
    Linux网络编程——TCP&UDP编程流程(一)_第1张图片

TCP中的阻塞

  • TCP服务器程序执行过程中会有两个位置阻塞
  1. 没有客户端连接时,accept方法会阻塞
  2. 客户端连接上但是没有发送数据,recv方法会阻塞

TCP编程主要函数详解

1. socket();
#include 

// 创建套接字,成功返回套接字的文件描述符(>= 0),失败返回-1
int socket(int domain,int type,int protocol);
参数 含义
domain 设置套接字的协议簇 :AF_UNIX / AF_INET / AF_INET6
type 设置套接字的服务类型:SOCK_STREAM(TCP) / SOCK_DGRAM(UDP)
protocol 一般设置为0,表示使用默认协议
2. bind();
// 将sockfd与一个socket地址绑定,成功返回0,失败返回-1
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
参数 含义
sockfd 网络套接字描述符
addr 地址结构,一般使用专用的IPV4的地址结构struct sockadddr_in,再强转为通用结构
addrlen socket地址的长度
  • bind方法也有可能绑定失败,失败原因如下
  1. 使用的IP地址不正确,IP地址一定是服务器程序运行的主机的IP地址,若测试则可用回环地址"127.0.0.1"
  2. 使用的端口号不正确
    (1)使用了其他TCP程序正在使用的端口号
    (2)使用了没有权限使用的端口号,如0-1024(知名端口)
3. listen();
// 创建一个监听队列以存储待处理的客户连接,成功返回0,失败返回-1
int listen(int sockfd,int backlog);
参数 含义
sockfd 被监听的 socket套接字
backlog 表示处于完全连接状态的 socket的上限,经典值为5
  • listen只是创建了一个监听队列,并不会阻塞,监听客户端链接是由内核来完成的
    Linux网络编程——TCP&UDP编程流程(一)_第2张图片
    listen创建两个队列,分别为未完成和已完成,其中 backlog为已完成握手的队列的长度
4. accept();
// 从listen监听队列中接收一个连接,成功返回一个新的连接socket,该socket唯一地标识了被接收的这个连接,失败返回-1
int accept(int sockfd,struct sockaddr addr,socklen_t *addrlen);
参数 含义
sockfd 执行过listen系统调用的监听socket
addr 用来获取被接受连接的远端socket地址
addrlen 指定该socket地址的长度
  • 新的连接 socket:与一个特点的客户端连接的socket,后续与此客户端的通信过程都是通过这个套接字完成
5. send();&recv();
// 读取sockfd上的数据
ssize_t recv(int sockfd,void *buff,size_t len,int flags);
// 往socket上写入数据
ssize_t send(int sockfd,const void*buff,size_t len,int flags);
参数 含义
sockfd accept()返回的新的连接 socket
recv:buff&len 分别指定读缓冲区的位置和大小
send:buff&len 分别指定写缓冲区的位置和数据长度
flags 参数为数据收发提供了额外的控制,一般为0
6. connect();
// 客户端需要通过此系统调用来主动与服务器建立连接,成功返回0,失败返回-1
int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen);
参数 含义
sockfd 由socket返回的一个socket
serv_addr 服务器监听的 socket地址(要连接的服务器的地址信息)
addrlen 指定这个地址的长度

你可能感兴趣的:(linux,网络,网络通信,c语言)