千家信息网

如何用C语言写一个TCP

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这期内容当中小编将会给大家带来有关如何用C语言写一个TCP,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程
千家信息网最后更新 2026年11月01日如何用C语言写一个TCP

这期内容当中小编将会给大家带来有关如何用C语言写一个TCP,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西socket(套接字)。

socket(套接字):简单来讲,socket就是用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

TCP协议

TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。

关键词:三次握手,可靠,基于字节流。

可能有朋友会问,TCP就这么简单一句话吗?当然不是,TCP作为非常重要的传输协议,细节知识是很多的,细讲起来这一篇文章怕是不够。不过在本篇内容中,我们只需了解他的几个关键词特性,就能很好的理解下面的内容。

TCP服务器端和客户端的运行流程

如图,这是一个完整的TCP服务器客户端的运行流程图,其实我个人认为程序啊,不管哪个语言都是一样,核心就在于算法的设计和函数的调用。那么图中的函数都是什么意思呢?

1.创建socket

socket是一个结构体,被创建在内核中

sockfd=socket(AF_INET,SOCK_STREAM,0); //AF_INT:ipv4, SOCK_STREAM:tcp协议

2.调用bind函数

将socket和地址(包括ip、port)绑定。

需要定义一个结构体地址,以便于将port的主机字节序转化成网络字节序

struct sockaddr_in myaddr; //地址结构体

bind函数

bind(sockfd,(struct sockaddr*)&myaddr,sizeof(serveraddr))

3.listen监听,将接收到的客户端连接放入队列

listen(sockfd,8) //第二个参数是队列长度

4.调用accept函数,从队列获取请求,返回socket描 述符

如果无请求,将会阻塞,直到获得连接

int fd=accept(sockfd, NULL,NULL);//这边采用默认参数

5.调用read/write进行双向通信

6.关闭accept返回的socket

close(scokfd);

下面放出完整代码:

/*服务器*/ #include  #include  #include  #include  #include  #include  #include  #include  int main() {     int sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字     if (sockfd < 0)     {         perror("socket");         return -1;     } //创建失败的错误处理     printf("socket..............\n"); //成功则打印"socket。。。。"          struct sockaddr_in myaddr; //创建"我的地址"结构体     memset(&myaddr, 0, sizeof(myaddr)); //对内存清零(保险起见)     myaddr.sin_family       = AF_INET; //选择IPV4地址类型     myaddr.sin_port         = htons(8888); //选择端口号     myaddr.sin_addr.s_addr  = inet_addr("192.168.3.169"); //选择IP地址    if (0 > bind(sockfd, (struct sockaddr*)&myaddr, sizeof(myaddr)))//绑定套接字     {         perror("bind");         return -1;     }     printf("bind..........\n");       if (0 > listen(sockfd, 8))//调用listen对指定端口进行监听     {         perror("listen");         return -1;     }     printf("listen............\n");          int connfd = accept(sockfd, NULL, NULL);//使用accept从消息队列中获取请求     if (connfd < 0)     {         perror("accept");         return -1;     }     printf("accept..............\n");     char buf[100];//定义一个数组用来存储接收到的数据     int ret;     while (1)     {         memset(buf, 0, sizeof(buf));         ret = read(connfd, buf, sizeof(buf));         if (0 > ret)         {             perror("read");             break;         }//执行while循环读取数据,当         else if (0 == ret)         {             printf("write close!\n");             break;         }         printf("recv: ");         fputs(buf, stdout);//打印接收到的数据     }     close(sockfd);//关闭套接字     close(connfd);//断开连接     return 0; } /*客户端*/(具体功能和服务器一样,所以不再加注释) #include  #include  #include  #include  #include  #include  #include  #include  int main() {  int sockfd;     if (0 > (sockfd = socket(AF_INET, SOCK_STREAM, 0)))     {         perror("socket");         return -1;     }     printf("socket...........\n");          struct sockaddr_in srv_addr;     memset(&srv_addr, 0, sizeof(srv_addr));     srv_addr.sin_family         = AF_INET;     srv_addr.sin_port           = htons(8888);     srv_addr.sin_addr.s_addr    = inet_addr("192.168.3.169");     if (0 > connect(sockfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)))     {         perror("connect");         return -1; //exit //pthread_exit     }     printf("connect..............\n");     char buf[100];     int ret;     while (1)     {         printf("send: ");         fgets(buf, sizeof(buf), stdin);         ret = write(sockfd, buf, sizeof(buf));         if (ret < 0)         {             perror("write");             break;         }         if (strncmp(buf, "quit", 4) == 0)             break;     }     close(sockfd);     return 0; }

上述就是小编为大家分享的如何用C语言写一个TCP了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

函数 套接字 客户 服务器 服务 内容 地址 队列 通信 语言 关键 客户端 就是 结构 网络 传输 不同 个人 关键词 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 上海挚品互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 卓越科技(互联网 ) 西安互联网科技公司 北京禾田雨橡互联网科技 互联网科技素材视频竖屏 安控科技rtu产品工业互联网 现代科技和互联网有关系吗 剑昆互联网络科技有限公司临桂 宜昌元轩互联网科技有限公司 中国互联网公司排名锤子科技 群盈汇互联网科技有限公司 云南省自由互联网科技有限公司 陕西云淼互联网科技公司 云南互联网科技学费 北京互联网科技类企业分布 求路客互联网科技电话 美国五大互联网科技公司市值多少 互联网对科技影响 奇酷互联网络科技 凡科互联网科技 深圳齐家互联网科技 武汉健翔互联网络科技有限公司 半导体行业属于互联网高科技类吗 广州梦谷互联网科技有限公司领导 世界互联网科技成果奖 马化腾互联网科技教学 互联网科技的前景 互联网大会出现的黑科技
0