C语言-TCP通信创建流程

TCP通信创建流程

1. 客户端创建TCP连接

在整个流程中, 主要涉及以下⼏个接⼝
            socket() : 创建套接字, 使⽤的套接字类型为流式套接字
            connect() : 连接服务器
            send() : 数据发送
            recv() : 数据接收

创建套接字

首先,我们需要创建套接字,套接字是通信的基础。我们可以通过 socket() 函数来创建套接字。

int socket(int domain, int type, int protocol);
参数:
    @domain
            地址族
            AF_UNIX, AF_LOCAL  本地通信,数据不仅过网卡
            AF_INET         IPV4 ineter⽹通信  
            AF_INET6        IPV6 ineter⽹通信
            AF_PACKET       网卡上的数据包通信
            ....
            
            
    @ type
            使⽤协议类型
                SOCK_STREAM 流式套接字(TCP)
                SOCK_DGRAM 报⽂套接字(UDP)
                SOCK_RAW原始套接字: (IP,ICMP)
                ......
                
    @protocol
            协议编号
            0 : 让系统⾃动识别
            IPPROTO_TCP : TCP协议
            IPPROTO_UDP : UDP协议


返回值:
        成功返回得到的⽂件描述符。当前可使用的最小描述符
        失败返回 -1

连接服务器

创建套接字之后,我们需要连接服务器。连接服务器需要调用 connect() 函数。

发起对套接字的连接 (基于⾯向连接的协议)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
    @sockfd
            套接字描述符
            
    @addr   连接的套接字的地址结构对象的地址 (⼀般为服务器)
            服务器地址
                struct sockaddr {
   
   
                    unsigned short sa_family; // 地址族 对应socket()中的domain
                    char sa_data[14]; // 地址数据 ip地址端口信息
                };
                        
                struct sockaddr_in {
   
    
                    short int sin_family; // 地址族 AF_INET
                    unsigned short int sin_port; // 端口号
                    struct in_addr sin_addr;// IP地址
                    unsigned char sin_zero[8]; // 填充字节 为了对齐sockaddr
                };
                
                struct in_addr {
   
   
                    uint32_t       s_addr; // IP地址
                };
            
    @addrlen
            地址长度


返回值:
        成功返回0
        失败返回-1 并设置 errno

数据发送

连接服务器之后,我们就可以向服务器发送数据。发送数据需要调用 send() 函数。

基于套接字(建⽴连接)发送数据
int send(int sockfd, const void *buf, size_t len, int flags);
参数:
    @sockfd
            套接字描述符
            
    @buf    发送的数据
            
    @len    发送数据的长度
            
    @flags  发送标志
函数返回值:
    成功返回发送的字节数
    失败返回-1,并设置errno

数据接收

服务器向客户端发送数据之后,客户端就可以接收数据。接收数据需要调用 recv() 函数。

接收套接字的数据 (基于⾯向连接的协议)
int recv(int sockfd, void *buf, size_t len, int flags);
参数:
    @sockfd
            套接字描述符
            
    @buf    接收的数据
            
    @len    接收数据的长度
            
    @flags  接收标志
函数返回值:
    成功返回接收的字节数
    失败返回-1,并设置errno

完整流程

//todo tcp客户端,循环发送数据,接收回传数据
#include <stdio.h>
#include <stdlib.h>
#<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可能只会写BUG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值