基于 TCP 套接字通信.ppt_第1页
基于 TCP 套接字通信.ppt_第2页
基于 TCP 套接字通信.ppt_第3页
基于 TCP 套接字通信.ppt_第4页
基于 TCP 套接字通信.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于 TCP 套接字通信,基于 TCP 套接字通信,套接字存在于通信域中,通信域也叫地址簇,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性,综合在一起,套接字通常只与同一区域的套接字交换数据,(也可能跨区通信,但这只是在执行某种转换进程后才能实现).Windows Sockets只支持一个通信域,网际域(AF_INET),这个域被使用网际协议簇通信进程使用 SOCK_STREAM流式套接字,提供面向连接的数据传输服务,数据无差错,无重复的发送,并且按发送顺序接送,流式套接字实际上是基于TCP实现的 网络字节顺序(套接字与地址簇中使用) 由于不同的计算机存放数据字节的顺序不同,所以

2、通信双方必须协商出统一的存放字节顺序,这样才能发送方的数据可以被接收方准确无误的读取,否则接收方读到的是一堆不知名的数据,所以通信前双方必须协商统一的用网络字节顺序,保证通信的正常进行,基于 TCP 套接字通信,在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式: 首先服务器方要先启动,并根据请示提供相应服务:(过程如下) 1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。 2、等待客户请求到达该

3、端口。 3、接收到重复服务请求,处理该请求并发送应答信号。 4、返回第二步,等待另一客户请求 5、关闭服务器。 客户方: 1、打开一通信通道,并连接到服务器所在主机的特定端口。 2、向服务器发送服务请求报文,等待并接收应答;继续提出请求 3、请求结束后关闭通信通道并终止。,基于 TCP 套接字通信,流程图,基于 TCP 套接字通信,创建套接字 SOCKET socket (int af, int type, int protocol ); af: 指定地址簇,对于TCP/IP协议的套接字,它只能写成AF_INET(或PF_INET) type:指定套接字类型,它只支持两种套接字,SOCK_ST

4、REAM(流式套接字),SOCK_DGRAM(数据报式套接字) protocol:指定与特定地址家族相关的协议,如果指定为0,那么系统就会根据地址格式和套接字类别,自动选择一个合适的协议 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);,基于 TCP 套接字通信,SOCKADDR_IN addrSrv; /定义套接字地址结构 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); /设置本地计算机的IP地址,一般INADDR_ANY在程序运行时会自动计算成本地的IP地址的,表示服务器能接收来自任何计算机的请求

5、 addrSrv.sin_family = AF_INET; /设置网络通信的网络协议族类型 addrSrv.sin_port = htons(4000); /设置本地(这里指服务端)计算机要打开的端口 addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); /设置远程计算机的IP地址,基于 TCP 套接字通信,将套接字绑定到端口上 bind(sockSrv,(SOCKADDR*) 5表示最大连接数量 ,建立套接字连接connect()和accept() /等待客户请求来到,当请求来到时候,接受请求,接受连接请求,返回一个新的对应于此连接套接字 S

6、OCKADDR_IN addrClient; int len = sizeof(SOCKADDR); SOCKET sClient=0; char sendText256; /开始监听 cout等待用户连接endl; while(sClient=0) sClient= accept(sockSrv,(SOCKADDR*) ,数据传输send()与recv() char buff256; char sendText256; send(sClient,sendText,strlen(sendText),0); int nRecv=recv(sClient,reiceiveText,256,0);,

7、关闭本次连接的通道 closesocket(sClient); closesocket(sockSrv);/关闭服务器套接字 WSACleanup();/结束套接字库的调用 system(pause);,程序代码 服务器端#include #include #include #pragma comment(lib,ws2_32.lib) using namespace std; void main() /加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); e

8、rr = WSAStartup( wVersionRequested, ,if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /创建套接字 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_p

9、ort = htons(4000); /将套接字绑定到端口上 bind(sockSrv,(SOCKADDR*),/等待客户请求来到,当请求来到时候,接受请求,接受连接请求,返回一个新的对应于此连接套接字 SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); SOCKET sClient=0; / char sendText256; /开始监听 cout等待用户连接endl; while(sClient=0) sClient= accept(sockSrv,(SOCKADDR*) ,/和客户通信 /接收数据 cout 0) reiceiveTex

10、tnRecv = 0; cout收到数据:; coutreiceiveText0endl; int a=reiceiveText0;,if(a=49) cout向客户端发送数据: endl; string s=接收地址是127.0.0.1; strcpy(sendText,s.c_str(); send(sClient,sendText,strlen(sendText),0); else if(a=50) cout向客户端发送数据: endl; string s=您当月产生话费100元; strcpy(sendText,s.c_str(); send(sClient,sendText,strl

11、en(sendText),0); else if(a=51) cout向客户端发送数据: endl; string s=您的账户余额10000元; strcpy(sendText,s.c_st send(sClient,sendText,strlen(sendText),0); ,else if(a=52) cout向客户端发送数据: endl; string s=0; strcpy_(sendText,s.c_str(); send(sClient,sendText,strlen(sendText),0); else couterrorendl; /关闭本次连接的通道 closesocket

12、(sClient); closesocket(sockSrv);/关闭服务器套接字 WSACleanup();/结束套接字库的调用 system(pause); ,客户端:#include #include /加载动态连接库ws2_32.dll,提供了网络相关API的支持 #pragma comment(lib,ws2_32.lib) using namespace std; void main() /加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, ,/建立通讯 socket SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(4000); /发出连接请求 cout请求与服务器连接endl; if(connect(sockClient,(SOCKADDR*) ,if(n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论