🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了手写TCP/IP——第8节TCP协议的实现3——添加TCP基本操作接口。🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
🔥 手写底层系列
🔥 手写TCP/IP系列
【OSI与课程讲解】
🌈章节引出:
前一篇章:
🌈章节速览:
1.控制块添加地址信息后:
struct _xtcp_t {
xtcp_state_t state; // 状态
uint16_t local_port, remote_port; // 本地端口 + 源端口
xipaddr_t remote_ip; // 源IP
xtcp_handler_t handler; // 事件处理回调
};
2.控制块添加关闭状态、监听状态:
typedef enum _xtcp_conn_state_t {
XTCP_CONN_CONNECTED,
XTCP_CONN_DATA_RECV,
XTCP_CONN_CLOSED,
}xtcp_conn_state_t;
3.打开TCP控制块
并且对刚刚分配好的控制块 设置为关闭状态。
/**
* 打开TCP
*/
xtcp_t * xtcp_open(xtcp_handler_t handler) {
xtcp_t * tcp = tcp_alloc();
if (!tcp) return (xtcp_t *)0;
tcp->state = XTCP_STATE_CLOSED;
tcp->handler = handler;
return tcp;
}
3.1TCP查找函数:
/**
* 根据远端的端口、ip找一个对应的tcp连接进行处理。
* 优先找端口、IP全匹配的,其次找处于监听状态的
* @param remote_ip
* @param remote_port
* @param local_port
* @return
*/
static xtcp_t* tcp_find(xipaddr_t *remote_ip, uint16_t remote_port, uint16_t local_port) {
xtcp_t * tcp, * end;
xtcp_t * founded_tcp = (xtcp_t *)0;
for (tcp = tcp_socket, end = tcp_socket + XTCP_CFG_MAX_TCP; tcp < end; tcp++) {
if ((tcp->state == XTCP_STATE_FREE) || (tcp->local_port != local_port)) {
continue;//如果是空闲,那就直接跳过
}
if (xipaddr_is_equal(remote_ip, &tcp->remote_ip) && (remote_port == tcp->remote_port)) {
return tcp; // 优先,远程的端口和ip完全相同,立即返回
}
if (tcp->state == XTCP_STATE_LISTEN) {
founded_tcp = tcp; // 没有,默认使用监听端口
}
}
return founded_tcp;
}
3.2在这一步再将TCP分配函数重新分配
/**
* 分配一个tcp连接块
* @return 分配结果,0-分配失败
*/
static xtcp_t * tcp_alloc(void) {
xtcp_t * tcp, * end;
for (tcp = tcp_socket, end = tcp_socket + XTCP_CFG_MAX_TCP; tcp < end; tcp++) {
if (tcp->state == XTCP_STATE_FREE) {
tcp->state = XTCP_STATE_CLOSED;
tcp->local_port = 0;
tcp->remote_port = 0;
tcp->remote_ip.addr = 0;
tcp->handler = (xtcp_handler_t)0;
return tcp;
}
}
return (xtcp_t *)0;
}
4.TCP控制块绑定端口:
/**
* 建立tcp与指定本地端口的关联,使得其能够处理来自该端口的包
* 以及通过该端口发送数据包
*/
xnet_err_t xtcp_bind(xtcp_t* tcp, uint16_t local_port) {
xtcp_t * curr, * end;
for (curr = tcp_socket, end = &tcp_socket[XTCP_CFG_MAX_TCP]; curr < end; curr++) {
if ((curr != tcp) && (curr->local_port == local_port)) {
return XNET_ERR_BINDED;
}
}
tcp->local_port = local_port;
return XNET_ERR_OK;
}
5.TCP监听函数,控制TCP进入监听状态
/**
* 控制tcp进入监听状态
*/
xnet_err_t xtcp_listen(xtcp_t * tcp) {
tcp->state = XTCP_STATE_LISTEN;
return XNET_ERR_OK;
}
6.TCP关闭函数
/**
* 关掉tcp连接
*/
xnet_err_t xtcp_close(xtcp_t *tcp) {
tcp_free(tcp);
return XNET_ERR_OK;
}
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈JAVA面试八股文系列专栏 关注走一波💕💕
🌈🌈JAVA基础试题集精讲 关注走一波💕💕
🌈🌈代码随想录精讲200题 关注走一波💕💕
总栏
🌈🌈JAVA基础要夯牢 关注走一波💕💕
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!