




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最近由于本人对网络编程的喜爱,所以对一点关于TCP协议socket编程的总结。由于本人的能力有限,写的可能过于简单,只适合初学者,欢迎大牛提出宝贵的意见,本人会感激不尽的。废话少说了,进入正题。(下面代码是基于VC6.0) 下图是一般socket 编程图。 服务器的建立: 获取的本机名,用来解析得到本机的IP地址的;接着就绑定IP地址成功,然后服务器就处于监听状态,等待客户端的连接。也就是接下来就是TCP/IP的三次握手的操作,该操作成功了服务器和客户端就可以进行通信了。以下是注释代码:cpp view plaincopyprint?1. voidsocketConnect()2. 3. charServer_name128;4. WSADATAwsaData;5. structhostent*hp;6. structsockaddr_inaddrServer;7. 8. WSAStartup(0x202,&wsaData);9. 10. sockfd=socket(AF_INET,SOCK_STREAM,0);/socket 11. gethostname(Server_name,128);12. hp=gethostbyname(Server_name);/获取本机名 13. printf(本机名:%sn,Server_name);14. 15. memset(&addrServer,0,sizeof(addrServer);/初始化 16. memcpy(&(addrServer.sin_addr),hp-h_addr,hp-h_length);/设置服务器的IP地址 17. addrServer.sin_family=AF_INET;/设置版本 18. addrServer.sin_port=htons(unsignedshort)SERVER_PORT);/设置端口号 19. /bind.绑定ip地址和端口号 20. if(SOCKET_ERROR=bind(sockfd,(LPSOCKADDR)&addrServer,sizeof(addrServer)21. 22. printf(Bindsocketerror!n);23. /exit(1); 24. 25. else26. 27. printf(绑定socketsuccess.n);28. 29. listen(sockfd,5);/listening.监听 30. printf(服务器监听状态.n);31. 32. ZeroMemory(void*)&addrtemp,sizeof(addrtemp);33. nlen=sizeof(addrtemp);34. connfd=accept(sockfd,&addrtemp,&nlen);/accept.三次握手 35. printf(acceptclientsuccess.nn);36. void socketConnect()char Server_name128;WSADATA wsaData;struct hostent *hp;struct sockaddr_in addrServer;WSAStartup(0x202, &wsaData);sockfd = socket(AF_INET, SOCK_STREAM, 0); /socketgethostname(Server_name, 128);hp = gethostbyname(Server_name); /获取本机名printf(本机名 : %sn, Server_name);memset(&addrServer, 0, sizeof(addrServer);/初始化memcpy(&(addrServer.sin_addr), hp-h_addr, hp-h_length); /设置服务器的IP地址addrServer.sin_family = AF_INET;/设置版本addrServer.sin_port = htons(unsigned short)SERVER_PORT); /设置端口号/bind.绑定ip地址和端口号if(SOCKET_ERROR = bind(sockfd, (LPSOCKADDR)&addrServer, sizeof(addrServer)printf(Bind socket error!n);/exit(1);elseprintf(绑定 socket success.n);listen(sockfd, 5); /listening.监听printf(服务器监听状态.n);ZeroMemory(void *)&addrtemp, sizeof(addrtemp);nlen = sizeof(addrtemp);connfd = accept(sockfd, &addrtemp, &nlen); /accept.三次握手printf(accept client success.nn);客户端的建立: 其实客户端和服务器代码都差不多的,只是最后面的一个connect()函数,就是发送一个请求链接给服务器,因为服务器在accept()函数时阻塞等待客户端的链接,然后经过三次握手,成功之后,服务器和客户端就可以进行通信了。cpp view plaincopyprint?1. WSAStartup(0x202,&wsaData);2. if(sockfd=socket(AF_INET,SOCK_STREAM,0)h_addr,host-h_length);/设置ip 13. addrServer.sin_family=AF_INET;/设置版本号 14. addrServer.sin_port=htons(unsignedshort)SERVER_PORT);/设置端口号 15. 16. /connect.向服务器发起链接 17. if(connect(sockfd,(structsockaddr*)&addrServer,sizeof(structsockaddr)18. 19. printf(connecterror!n);20. exit(1);21. 22. printf(连接服务器成功connecsuccess.nn);WSAStartup(0x202, &wsaData);if( (sockfd = socket(AF_INET, SOCK_STREAM, 0) h_addr, host-h_length); /设置ipaddrServer.sin_family = AF_INET; /设置版本号addrServer.sin_port = htons(unsigned short)SERVER_PORT); /设置端口号/connect.向服务器发起链接if(connect(sockfd, (struct sockaddr *)&addrServer, sizeof(struct sockaddr)printf(connect error!n);exit(1);printf(连接服务器成功connec success.nn);接下来是send()和recv()函数:cpp view plaincopyprint?1. /send.发送消息 2. scanf(%s,sendBuf);3. getchar();4. 5. if(sendbytes=send(connfd,sendBuf,strlen(sendBuf),0)=0)6. 7. printf(senderror!n);8. continue;9. 10. memset(sendBuf,0,sizeof(sendBuf);/send.发送消息scanf(%s, sendBuf);getchar();if( (sendbytes = send(connfd, sendBuf, strlen(sendBuf), 0) = 0)printf(send error !n);continue;memset(sendBuf, 0, sizeof(sendBuf);cpp view plaincopyprint?1. /recv.接收消息 2. memset(recvBuf,0,sizeof(recvBuf);3. if(recvbytes=recv(connfd,recvBuf,sizeof(recvBuf),0)=0)4. 5. printf(recverror!n);6. exit(1);7. 8. printf(recvbytes=%dn,recvbytes);9. printf(recvfromclient:%sn,recvBuf);TCP/IP通信程序设计的丰富多样性刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程序,据此一些人可能会认为TCP/IP编程很简单。其实不然,TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在通信方式和报文格式的多样性上。一。通信方式主要有以下三大类:(一)SERVER/CLIENT方式1.一个Client方连接一个Server方,或称点对点(peertopeer):2.多个Client方连接一个Server方,这也是通常的并发服务器方式。3.一个Client方连接多个Server方,这种方式很少见,主要用于一个客户向多个服务器发送请求情况。(二)连接方式1.长连接Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:netstatfinet|grep端口号(如5678)。此种方式常用于点对点通讯。2.短连接Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.(三)发送接收方式1.异步报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:(1)异步双工:接收和发送在同一个程序中,有两个不同的子进程分别负责发送和接收(2)异步单工:接收和发送是用两个不同的程序来完成。2.同步报文发送和接收是同步进行,既报文发送后等待接收返回报文。同步方式一般需要考虑超时问题,即报文发上去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。实际通信方式是这三类通信方式的组合。比如一般书上提供的TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的组合是基本不用的,比较常用的有价值的组合是以下几种:同步短连接Server/Client 同步长连接Server/Client异步短连接Server/Client异步长连接双工Server/Client异步长连接单工Server/Client其中异步长连接双工是最为复杂的一种通信方式,有时候经常会出现在不同银行或不同城市之间的两套系统之间的通信。比如金卡工程。由于这几种通信方式比较固定,所以可以预先编制这几种通信方式的模板程序。二.报文格式通信报文格式多样性更多,相应地就必须设计对应的读写报文的接收和发送报文函数。(一)阻塞与非阻塞方式1.非阻塞方式读函数不停地进行读动作,如果没有报文接收到,等待一段时间后超时返回,这种情况一般需要指定超时时间。2.阻塞方式如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。(二)循环读写方式1.一次直接读写报文在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。2.不指定长度循环读写这一般发生在短连接进程中,受网络路由等限制,一次较长的报文可能在网络传输过程中被分解成了好几个包。一次读取可能不能全部读完一次报文,这就需要循环读报文,直到读完为止。3.带长度报文头循环读写这种情况一般是在长连接进程中,由于在长连接中没有条件能够判断循环读写什么时候结束,所以必须要加长度报文头。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建三明永安市公安局招聘警务辅助人员19人考前自测高频考点模拟试题及答案详解(全优)
- 2025广东潮州市饶平县新塘镇人民政府招聘后勤服务人员1人模拟试卷完整答案详解
- 2025海南琼海市招商局招聘编外人员1人(1号)模拟试卷含答案详解
- 2025年度威海机械工程高级技工学校公开招聘教师(6人)考前自测高频考点模拟试题含答案详解
- 用户参与度提升策略-第5篇-洞察与解读
- 2025春季中国电气装备平高集团、平高电气校园招聘模拟试卷及一套参考答案详解
- 2025北京大兴区妇幼保健院临时辅助用工招录岗位12人考前自测高频考点模拟试题及完整答案详解一套
- 2025年吉安市庐陵产业运营服务有限公司公开招聘物业经理模拟试卷及答案详解(各地真题)
- 2025黑龙江齐齐哈尔市建华区北华街道公益性岗位招聘模拟试卷及答案详解(有一套)
- 2025湖北襄阳市神农架林区审计局招聘投资审计专业技术人员2名模拟试卷及答案详解(名校卷)
- (2025)辅警笔试题库及参考答案
- 退役军人服务授课课件
- 劳动保障监察投诉书格式及写作范文
- 淮北矿业安全管理办法
- 中班幼儿在角色游戏中同伴模仿行为研究
- 2026年高考语文备考之家庭伦理小说知识点
- 联名合作授权协议书范本
- ECMO护理进修汇报
- 营救小羊中班课件
- 跟岗干部管理办法中组部
- 乐理知识入门教学课件
评论
0/150
提交评论