




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Windows的网络编程研究1.基本概念的清晰网络编程:通过使用套接字来达到进程间通信目的编程就是网络编程。windows提供的基于网络编程的就是套接字也就是winsock。Windows Sockets:Windows Sockets顾名思义,它就是在Windows环境下使用的一套网络编程机制(或规范),常简称为Winsock。套接口:Windows Sockets API依靠套接口(Socket)进行通信,套接口可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点,这个端点是个逻辑上的概念。其本质是通信过程中所要使用的一些缓冲区及其一些相关的数据结构。阻塞与非阻塞通信:在网络编程当中,可以将通信分为阻塞与非阻塞两种模式,对于不同的协议,阻塞和非阻塞通信有不同的表现。以套接口编程为例,在阻塞模式下,利用TCP发送一个报文时,如果低层次协议没有可用空间来存放用户数据,则应用进程将阻塞(即进行等待),直到有可用的空间,而在非阻塞模式下,调用将直接返回,而不需要等待。在应用进程调用接收函数接收报文时,在阻塞模式下,若没有到达数据,则调用将一直阻塞直到有数据到达或出错为止,而在非阻塞模式下,将直接返回而不需要等待。2.相关函数学习与研加载栈协议(WSAStartup): 在使用Winsock API编写网络应用程序时,要使用大量系统已经实现的网络 功能函数,在调用任何一个Winsock API函数之前,都必须先检查协议栈的安装情况,也就是检查系统中是否有Windows Socket的实现库。通过调用WSAStartup函数便可以检测系统中有没有一个或多个Windows Socket 的实现。这个函数是进行网络编程的过程当中首先需要调用的函数,接下来才可以进一步的调用其他的API函数。1.函数格式:int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);2.函数参数说明:wVersionRequested:第一个参数是一个双字节型数据,它指定将要在程序中要使用的Winsock版本号。一般如果要加载Winsock 2.2版本,则可以通过MAKEWORD(2,2);实现。lpWSAData:是一个指向WSADATA结构的指针,当该函数被调用的时候,它将返回关于Windows Socket 实现的详细信息。可用于相关信息的返回与查询。创建套接口(Socket): 应用程序在使用套接口进行通信之前,必须要有一个套接口。在Winsock中一般使用Socket()函数来实现一个网络应用程序的套接口。1.函数格式:SOCKET socket(int af,int type,int protocol);2.函数参数说明:af:说明套接口要使用的协议地址族(指一系列的互联网协议),如果想建立一个UDP/TCP套接口,只能用常量AF_INET,表示使用互联网协议(IP)地址。type:描述套接口的协议类型。当第一个参数af是AF_INET的时候,他只能使用SOCK_STREAM、SOCK_DGRAM或SOCK_RAW中的任意一个。protocol:说明该套接口使用的是特定协议。当以上两个参数确定以后,协议字段可以使用的值是限定的。如果不希望使用特定的协议,那么这一项可以设为0,系统就会根据前面的设置自动确定一个协议字段的取值。地址绑定(bind) 当使用socket()函数创建了一个套接口后,该套接口是还不能直接使用的,因为他只存在于一个名字空间中,也就是说它只是确定了通信所希望使用的服务类型,并没有与该主机上提供服务的某个段口联系在一起,bind()函数通过给一个未命名的套接口分配一个本地名字莱维套接口创建本地绑定(就是把一个套接口与一个主机地址和端口号联系起来),本函数适用于数据包或者流类太接口。1.函数格式:int bind(SOCKET s,const struct sockaddr FAR* name,int namelen);2.函数参数说明:s:标识一个未绑定套接口的描述字,它是socket()函数调用成功时返回的值。name:是一个与指定协议有关的地址结构指针,它指向的值是赋予套接口的地址信息。在Winsock中使用sockaddr_in结构指定IP地址和端口信息,它的定义如下: struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8 这四个字段的含义如下:sin_family:该字段必须为AF_INET,以告诉Winsock所使用的IP地址族。sin_port:它是以网络字节顺序表示的16位端口号。sin_addr:它是以网络字节顺序表示的32位IP地址。sin_zero:该字段不用,填充为0。3.函数返回值: 成功的话,返回0,否则返回SOCKET_ERROR。服务器端监听连接(listen)在一个服务器端程序中,用socket()函数成功创建了一个套接口,并且用bing()函数和一个指定的地址绑定起来,就要指示该套接口进入监听连接请求状态,可以接收由客户端发出的连接请求,这时候就要用Winsock API函数listen()。1.函数格式:int listen(SOCKET s,int backlog);2.函数参数说明:s:用于标识一个已绑定了地址,但还未建立连接的套接口描述字。backlog:这个参数指定了正在等待连接的最大队列长度。需要设置合适的连接数。3.函数返回值: 成功的话,返回0,否则返回SOCKET_ERROR。客户端请求连接(connect) 当服务器端建立好套接口并与一个本地地址绑定后,就进入监听状态,等待客户端发出连接请求,从而为客户端提供服务。在客户端套接口建立好之后,就要用connect()函数,提出与一个服务器建立连接的请求,如果服务器接受请求,就可以在服务器的远程套接口与客户端的本地连接口之间建立一条连接。1.函数格式:int connect(SOCKET s,struct sockaddr FAR * name,int name len);2.函数参数说明:s:将要建立连接的套接口描述字。name:是一个指向远端套接口地质结构(sockaddr_in)的指针,表示s套接口欲与其建立一条连接。name len:name名字的长度。3.函数返回值: 成功的话,返回0,否则返回INVALID_SOCKET。服务器端接受连接(accept) 在服务器端通过listen()函数调用表示服务器进入监听客户的连接请求状态,而在服务器端调用accept()函数表示可以接收来自客户端由connect()发出的连接请求。1.函数格式:SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);2.函数参数说明:s:标识一个套接口描述字,该套接口处于监听连接的状态。addr:是一个地址结构的指针,用来存放发出连接请求的那个客户机的IP地址信息。addrlen:该函数指出客户套接口地址的长度。3.函数返回值: 成功的话,返回一个新的套接口描述符,它对应于已经接受的那个客户机的连接。对于该客户机后续的所有操作,都使用这个新的套接口描述符,所以把它叫做已连接套接口描述符。如果错误,则返回INVALID_SOCKET。3.关于相关问题的研究基本程序:*服务器端*#include #include #include #define DEFAULT_PORT 789void main()int iPort=DEFAULT_PORT;WSADATA wsaData;SOCKET sListen, sAccept;int iLen;int ban;char buf=I am a server.;char buf14;buf13=0;struct sockaddr_in ser,cli;printf(-n);printf(Server is waitting for connecting.n); printf(-n);if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(Failed to load Winsock.n);return ;sListen=socket(AF_INET,SOCK_STREAM,0);if (sListen=INVALID_SOCKET)printf(socket() Failed:%dn,WSAGetLastError();return ;ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=htonl(INADDR_ANY);if (bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR)printf(bind() Failed:%dn,WSAGetLastError();return ;if (listen(sListen,5)=SOCKET_ERROR)printf(listen() Failed:%dn,WSAGetLastError();return;iLen=sizeof(cli);sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen);if (sAccept=INVALID_SOCKET)printf(accept() Failed: &dn,WSAGetLastError(); return;while(1) if(ban=recv(sAccept,buf1,strlen(buf1),0)=0) break; printf(%sn,buf1);closesocket(sAccept);closesocket(sListen);WSACleanup();*客户端*#include #include #include stdio.h#include time.h#define MAX_BUFFER 1024#define DAYTIME_SERVER_PORT 789int in=0;int main(void)SOCKET connectionFd;struct sockaddr_in servaddr;char timebuffer44=add,sub,mul,div;WSADATA wsaData;if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(命令套接字初始化失败n);return -1;connectionFd=socket(AF_INET,SOCK_STREAM,0);if (connectionFd=-1)printf(socket error!n);return (-1);memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family=AF_INET;servaddr.sin_port=htons(DAYTIME_SERVER_PORT);servaddr.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);if(connect(connectionFd,(structsockaddr *)&servaddr,sizeof(servaddr)=INVALID_SOCKET)printf(connect() Failed:%dn,WSAGetLastError();return (0);for (int i=0;i10;i+)printf(%d,send(connectionFd,timebufferi%4,strlen(timebufferi%4),0);printf(error:%dn,WSAGetLastError();printf(%s ,timebufferi%4);/printf(flag-1n);closesocket(connectionFd);return (0);如何实现多次传递以及注意事项:如果希望有客户端到服务器端多次的传递数据,如以上代码中蓝色字体部分。之前出现过的问题是:发送后客户端出现10054错误,原因是在send和recv的时候,求其len,都使用了sizeof()函数,sizeof()函数与strlen()函数的区别:strlen()函数是计算字符串长度,sizeof()是返回一个类型所占用的字节数,在这里是要计算字符串的长度。这样的话,客户端和服务器段就可以多次的传输数据。以上程序结果如图1和图2所示: 图1(服务器端) 图2(客户端)多客户访问过程的问题及研究: 多客户端访问的过程是一个什么样的过程呢?在listen()的过程当中,假定backlog参数为3的时候,那么如果有4个客户端同时对服务器进行连接请求,那么前三个请求会被放在一个“等待队列”中,以便应用程序依次为他们提供服务,而第四个请求会造成一个错误。这个过程的验证如下:将服务器端粉色部分改至如下:while(1)sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen);if (sAccept=INVALID_SOCKET)printf(accept() Failed: &d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国低聚半乳糖(GOS)行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国会展中心行业市场发展分析及前景趋势与投资机会研究报告
- 2025-2030中国仓储行业市场发展现状及消费需求与投资前景研究报告
- 2025-2030中国九水硝酸铬市场发展前景及投资潜力分析研究报告
- 2025-2030中国中药胶囊行业市场深度调研及投资策略与投资前景研究报告
- 2025-2030中国丙戊酸钠片行业市场现状供需分析及投资评估规划分析研究报告
- 建筑行业施工安全责任合同协议
- 2025-2030中国三甘醇行业市场发展趋势与前景展望战略研究报告
- 智能装备制造技术转让合同
- 物流运输服务免责条款合同
- 发证机关所在地区代码表
- 奥托尼克斯计米器使用说明书
- 风生水起博主的投资周记
- 供水管网施工组织设计
- 最全的冷轧知识材质牌号分类及生产工艺
- 易制毒、易制爆化学品安全培训
- 气化风机检修工艺规程
- 美女金喜善写真集
- 大学物理平面电磁波ppt课件
- 八年级下写字课
- 前列腺癌临床路径(最全版)
评论
0/150
提交评论