您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 实验一-Windows下Socket编程实现简单通信
天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名刘琪琪学号20125871专业网络工程班级1班实验题目Windows下Socket编程实现简单通信课程名称网络编程课程代码实验时间2015实验地点7-219批改意见成绩教师签字:实验Windows下Socket编程实现简单通信一实验目的在windows环境下进行socket编程,实现两台主机间的简单通信。二实验环境搭载Windows7操作系统的PC机VC6.0编译器三实验内容1,服务器、客户端创建套接字2,客户端发送连接请求3,服务器收到请求后打印连接成功消息四实验报告要求1,有客户端和服务器的完整代码2,实验结果截图3,Socket通信过程流程图五部分源代码及主要Socket函数参考1,注册套接字函数socket(intaf,inttype,intprotocol)参数解释:af:一个地址描述,目前只支持AF_INET格式,也就是说在本次实验中此参数直接写为AF_INET即可。type:指定socket类型,例如TCP类型(SOCK_STREAM)UDP类型(SOCK_DGRAM)protocol:套接口制订协议类型可以为0,。常用类型有IPPROTO_TCP、IPPROTO_UDP等2,绑定套接字函数bind(SOCKETs,conststructsockaddrFAR*addr,intnamelen);参数解释:s:socket()函数返回的套接口描述字addr:指向Socket地址的指针namelen:该地址的长度3,监听函数listen(SOCKETs,intbacklog)参数解释:s:socket()函数返回的套接口描述字backlog:等待连接队列的最大长度4,接收连接函数accept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen)参数解释:s:socket()函数返回的套接口描述字addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。addr参数的实际格式由套接口创建时所产生的地址族确定addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数5,发送连接请求函数connect(SOCKETs,conststructcoskaddrFAR*name,intnamelen)s:socket()函数返回的套接口描述字name:想要进行连接的端口名namelen:名字长度客户端:#includestdio.h#includestdlib.h#includestring.h#includeWinSock2.h#definePORTNUMBER333#pragmacomment(lib,ws2_32.lib)#defineQueueLen6intvisits=0;intmain(intargc,char*argv[]){WORDversion;version=MAKEWORD(1,1);WSADATAwsa;if(0!=WSAStartup(version,&wsa)){//初始化socket()printf(WSAStartuperror!\n);exit(0);}//structhostent*ptrh;structsockaddr_inservaddr;structsockaddr_inclientaddr;intlistenfd;intclientfd;intport;intalen;charbuf[1000];memset(&servaddr,0,sizeof(servaddr));//初始化servaddr为0servaddr.sin_family=AF_INET;//主机地址标识的数据结构,使用TCP/IP协议servaddr.sin_addr.s_addr=INADDR_ANY;//32位的IP地址,网络字节顺序if(argc1){port=atoi(argv[1]);}else{port=PORTNUMBER;}if(port0){servaddr.sin_port=htons((unsignedshort)port);//把端口转换成网络序}else{fprintf(stderr,badportnumber%d\n,argv[1]);exit(0);}listenfd=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);//注册一个socketdescriptionDWORDerror=GetLastError();if(listenfd0){fprintf(stderr,socketcreateionfailed!\n);exit(0);}if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))0){//绑定到端口fprintf(stderr,bindfailed!\n);exit(0);}if(listen(listenfd,QueueLen)0){//开始监听端口fprintf(stderr,listenfailed!\n);exit(0);}while(1){//主循环alen=sizeof(clientaddr);if((clientfd=accept(listenfd,(structsockaddr*)&clientaddr,&alen))0){//接受客户端的连接fprintf(stderr,acceptfailed!\n);exit(0);}printf(连接成功!!!!);visits++;sprintf(buf,Thisserverhasbeenconnected%dtime\n,visits);//把需要发送的数据放到缓冲区里面send(clientfd,buf,strlen(buf),0);//发送数据到客户端closesocket(clientfd);}return0;}服务器端:#includestdio.h#includestdlib.h#includestring.h#includeWinSock2.h#includewinsock.h#includews2tcpip.h#defineMAXLINE1000#defineSERVERPORT333#pragmacomment(lib,ws2_32.lib)intmain(intargc,char*argv[]){WORDversion;version=MAKEWORD(1,1);WSADATAwsa;if(0!=WSAStartup(version,&wsa)){//初始化socketprintf(WSAStartuperror!\n);exit(0);}intsockfd,n;charrecvline[MAXLINE+1];structsockaddr_inservaddr;memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERVERPORT);servaddr.sin_addr.s_addr=inet_addr(192.168.0.103);if((sockfd=socket(AF_INET,SOCK_STREAM,0))0){printf(sockfderror!\n);exit(0);}printf(sockfdis%d\n,(int)sockfd);if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(structsockaddr))0){printf(connecterror!\n);exit(0);}while((n=recv(sockfd,recvline,MAXLINE,0))0){recvline[n]=0;if(fputs(recvline,stdout)==EOF){printf(fputserror!\n);exit(0);}}if(n0)printf(readerror!);exit(0);return0;}六实验结果截图客户端:服务器端:
本文标题:实验一-Windows下Socket编程实现简单通信
链接地址:https://www.777doc.com/doc-6499808 .html