C语言中怎么实现TCP通信
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,C语言中怎么实现TCP通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。TCP协议TCP协议:是一种面向连接的、可靠的、基于字节流的传输
千家信息网最后更新 2025年02月03日C语言中怎么实现TCP通信
C语言中怎么实现TCP通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
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安全错误
数据库的锁怎样保障安全
在数据库中日期属于什么类型
宜良上门软件开发
保定冀麦软件开发有限公司
护苗网络安全课三播放
网站的设计需要数据库
搜亚网络技术服务刷赞
网络安全为人民网络靠人民心得
把二维数组存到数据库
网络安全隐患100个安全隐患
类似ncbi数据库
梦想精灵谷神奇宝贝服务器
服务器不能连接以太网
北航信息网络安全复习资料
网络安全模式重装系统有用吗
阿里云服务器安装方法
保护网络安全的内容
云服务器内网穿透1m带宽
想学网络技术去哪家好
二道区现代化网络安全质量服务
mysql数据库概述
魔兽tbc 服务器人数在哪里查
u盘装系统服务器
夸克浏览器设置代理服务器
厦门盈赢银网络技术有限公司
在家软件开发设计
acs数据库如何登陆
软件开发 cmm 安全
宝山区重型网络技术厂家供应
如何查看达梦数据库的有效期
服务器第三代内存条价格