TCP网络编程基础

TCP网络编程基础

  • 套接字
    - 套接字协议族/地址族
    - 套接字地址结构
    - ...
  • 套接字描述符
    - 协议族
    - 协议类型
    - 具体协议

创建网络插口(套接字)

​
#include <sys/types.h>
#include <sys/socket.h>
// 创建一个套接字并返回一个套接字描述符
int socket(int domain, int type, int protocol);  
                 |           |           |
                 |           |           |
                 V           V           V
               协议族      协议类型     具体协议

​

设置套接字地址结构

// 1、套接字编程需要指定套接字的地址
// 2、不同协议族有不同的地址结构
// 3、地址结构通常以sockaddr_开头,例如以太网的sockaddr_in、unix域的sockaddr_un

// 通用套接字地址结构
// 大小为16B
struct sockaddr
{
	sa_family_t sa_family;	// 协议族(说明是哪个协议族的地址)
							// 大小为2B
							
	char sa_data[14];	// 协议族数据(地址信息,例如端口 + ip)
}


// 协议族特定地址结构
// 例1、以太网地址结构如下
struct sockaddr_in
{
    u8	sin_len;	// 地址结构的长度(16B)
    
    u8	sin_family; // 协议族(AF_INET)
    
    u16	sin_port;	// 16位端口号,网络字节序(大端方式)
    
    struct in_addr sin_addr;	// 32位IP地址	     
                               
    char	sin_zero[8];	// 未使用
}
// 32位IP地址
struct in_addr
{
	u32 s_addr;  // 32位IP地址                   
}


// 例2、unix域地址结构
struct sockaddr_un
{
    sa_family_t	sun_family;	// 协议族(AF_UNIX)
    char sun_path[UNIX_PATH_MAX];	// 路径名
}

绑定套接字地址端口

#include <sys/types.h>
#include <sys/socket.h>
// 将套接字描述符对应的套接字与指定地址端口绑定
// 设置套接字的地址(端口+ip)
int bind(int sockfd, const struct sockaddr * my_addr, socklen_t addrlen);
                |                                |                  |
                |                                |                  |
                V                                V                  V
            套接字描述符                     套接字地址结构   套接字地址结构的长度
                                                  |                  |
                                                  ——————————|—————————
                                                            |
                                                            V
                                                  函数传递参数的惯用技巧

监听本地端口

#include <sys/socket.h>
// 1、更新套接字的状态为TCP_LISTEN
// 2、为等待队列申请空间
// 3、侦听本地端口,将客户端请求加入等待队列
int listen(int sockfd, int backlog);
                  |            |
                  V            V
              套接字描述符  等待队列长度

接收网络请求

#include <sys/types.h>
#include <sys/socket.h>
// 1、创建一个客户端套接字(先用服务端的套接字信息进行初始化),产生对应的套接字描述符(用来保存连接成功的客户端的状态)
// 2、接受客户端连接请求,将相应的信息填入新建立的客户端套接字
// 3、将客户端的套接字描述符和地址信息传递给用户层
int accept(int sockfd, struct sockaddr * addr, socklen_t * addrlen);
 |                |                        |                   |
 |                |                        |                   |
 V                V                        V                   V
客户端套接字描述符 服务端套接字描述符     客户端地址结构       地址结构的长度
                                           |___________________|
                                                     |
                                                     V
                                           用来保存客户端的地址信息

连接目标服务器

#include <sys/types.h>
#include <sys/socket.h>
// 向目标服务器发送建立连接请求(三报文握手的第一次)
int connect(int sockfd, struct sockaddr * addr, int addrlen);
                   |                        |           |
                   |                        |           |
                   V                        V           V
               套接字描述符         目标服务器的地址结构 地址结构的长度
                                           |______________|
                                                   |
                                                   V
                                          目标服务器的地址(端口 + ip)

关闭套接字

#include <sys/socket.h>
// 关闭打开的套接字,释放系统资源
int close(int fd);
​
// 可以指定关闭方式
int shutdown(int s, int how);
                 |        |
                 |        |
                 V        V
            套接字描述符  关闭方式
                            |
                   ___________________
                   |        |        |
                   V        V        V
                SHUT_RD  SHUT_WR  SHUT_RDWR
                 切断读    切断写   切断读写

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Linhanmic

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

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

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

打赏作者

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

抵扣说明:

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

余额充值