大家好,今天来为大家解答自己动手用C语言写一个服务器和客户端(TCP)-c语言 tcp服务器这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
TCP协议TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在计算机网络的简化OSI模型中,它完成第四层传输层规定的功能。
[[320547]]
关键词:三次握手,可靠,基于字节流。有的朋友可能会问,TCP就这么简单吗?当然不是。 TCP作为一个非常重要的传输协议,有很多详细的知识。这篇文章可能不足以详细解释它。不过,在这篇文章中,我们只需要了解它的几个关键词特征,就可以很好地理解后面的内容。
TCP服务器和客户端操作流程
如图所示,这是TCP服务器——客户端的完整操作流程图。其实我个人认为无论语言如何,程序都是一样的。核心在于算法的设计和函数的调用。那么图中的功能是什么意思呢?
1.创建socketsocket是内核中创建的一个结构体
sockfd=socket(AF_INET,SOCK_STREAM,0);//AF_INT:ipv4,SOCK_STREAM:tcp协议2.调用bind函数将socket绑定到地址(包括ip、端口)。
需要定义一个结构体地址来将端口的主机字节顺序转换为网络字节顺序。
structsockaddr_inmyaddr;//地址结构bind函数bind(sockfd,(structsockaddr*)myaddr,sizeof(serveraddr))3.listen监听,将接收到的客户端连接放入队列Listen(sockfd,8)//第二个参数是队列长度4.调用accept函数,从队列获取请求,返回socket描 述符。如果没有请求,将阻塞直到获得连接
intfd=accept(sockfd,NULL,NULL);//这里使用默认参数5.调用read/write进行双向通信6.关闭accept返回的socketclose(scokfd);下面放出完整代码:
/*服务器*/#include#include#include#include#include#include#include#includein.hintmain(){intsockfd=socket(AF_INET,SOCK_STREAM,0);//创建socket if(sockfd0){perror( 'socket ');return-1;}//创建失败的错误处理printf('socket..\n');//如果成功则打印"socket."structsockaddr_inmyaddr ;//创建“我的地址”结构体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(0bind(sockfd,(structsockaddr*)myaddr,sizeof(myaddr) )) //绑定socket {perror('bind');return-1;}printf('bind..\n');if(0listen(sockfd,8))//调用Listen 监听指定端口{perror('listen'); return-1;} printf('听..\n'); intconnfd=accept(sockfd,NULL,NULL );//使用accept从消息队列中获取请求if(connfd0){perror('accept');return-1;}printf('accept..\n' );charbuf[100];//定义一个数组,存放接收到的数据intret;while(1){memset(buf,0,sizeof(buf));ret=read(connfd,buf ,sizeof(buf) );if(0ret){perror('read');break;}//执行while循环读取数据,当elseif(0==ret){printf('writeclose!\n') ;break;}printf( 'recv:');fputs(buf,stdout);//打印接收到的数据}close(sockfd);//关闭socket close(connfd);//断开return0;}/*Client*/(具体功能与服务端相同,所以不需要注释)#include#include#include#include#include#include#includein.h#includeintmain(){intsockfd;if(0(sockfd=socket) (AF_INET,SOCK_STREAM,0) )){perror('socket');return-1;}printf('socket.\n');structsockaddr_insrv_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(0connect(sockfd,(structsockaddr*)srv_addr,sizeof(srv_addr))){perror ( 'connect');return-1;//退出//pthread_exit}printf('connect..\n');charbuf[100];intret;while(1) { printf('send:');fgets(buf,sizeof(buf),stdin);ret=write(sockfd,buf,sizeof(buf));if(ret0){perror('write');break;}if ( strncmp(buf,'退出',4)==0)break;}关闭(sockfd);return0;}
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7050.html
用户评论
这篇文章应该很有趣!学习C语言编程确实很值得。
有17位网友表示赞同!
一直想搭建一个自己的服务器,不知道这篇文章能给我带来哪些启发。
有6位网友表示赞同!
TCP协议其实挺简单的,只要理解了它的工作机制就好上手了。
有7位网友表示赞同!
自己动手写代码总是能学到更多东西,比只是单纯的阅读教程效果更好。
有14位网友表示赞同!
C语言编程可以提高逻辑思维能力,这篇文章让我有机会锻炼一下编程技巧。
有19位网友表示赞同!
服务器和客户端之间的交互机制确实挺巧妙的,需要仔细研究才能搞懂。
有8位网友表示赞同!
这个项目难度如何?感觉自己能不能完成呢?
有10位网友表示赞同!
现在有很多网络通信库了,好像用这些库写起来更方便一些吧。
有9位网友表示赞同!
我之前学过Java编程,C语言的语法和编程思想还是不太一样。
有7位网友表示赞同!
如果有实践代码示例,会更容易理解这个项目的实现过程。
有20位网友表示赞同!
我想学习一下网络编程知识,这篇文章看起来是一个很好的入门资源。
有13位网友表示赞同!
TCP协议在实际应用中是常用的通信方式,了解它很有用。
有12位网友表示赞同!
搭建一个简单的聊天服务器应该很容易吧? 试试看!
有11位网友表示赞同!
我想先学习一下C语言基础知识,再尝试这个项目比较好。
有15位网友表示赞同!
做个TCP服务器和客户端可以锻炼我对网络编程的理解。
有14位网友表示赞同!
希望这篇文章能提供一些详细的技术细节,方便我深入学习。
有19位网友表示赞同!
这篇文章让我重新燃起了学习编程的热情!
有10位网友表示赞同!
这个项目看起来很有挑战性,我也打算试试看!
有13位网友表示赞同!
如果遇到问题可以去相关论坛寻求帮助吗?有什么推荐?
有5位网友表示赞同!