实验三、WINSOCK套接字编程实验报告序号:姓名:刘易学号: 20101150040 成绩指导老师:1.实验目的:用C或JA V A语言编写客户端、服务器程序,实现基于TCP或UDP的网络通信数据传输服务,熟悉基于TCP或UDP的Socket编程原理。
2.实验环境:建立在TCP/IP 网络体系结构之上计算机网络实验环境。
各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。
计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。
3.实验指导:参见套接字编程实验指导4.实验步骤(1)运行指导书中给出的参考程序,分析实验结果,并回答问题(1)-(3)(2)根据给定参考程序修改代码,完善修改服务器和客户端的功能。
并回答问题(4)-(5)5.实验结果分析(1)为什么在服务器和客户端要包含winsock2.h文件?(2)为什么在服务器和客户端程序中要加入#pragma comment(lib,"ws2_32.lib") 语句,如果不加会出现什么问题?(3)为什么在服务器和客户端程序中要使用WSAStartup函数,如果不用,程序会有什么问题?(4)修改后的程序完成实现了什么功能,附上修改后的源代码。
(修改或填加的代码用波浪线标注,并填加注释),并附上实验截图客户端改变的代码:{ for(;;){memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");if((rval=recv(fd,buf,sizeof(buf),0)<0))perror("reading stream message");if(rval==0)printf("server said :%s\n",buf);}服务器端修改的代码:for(;;){memset(buf, 0, sizeof(buf));if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))perror("reading stream message");if (rval == 0)printf("client said :%s\n",buf);printf("server-->");scanf("%s",&buf);rval=send(msgsock,buf,strlen(buf)+1,0);}}(5)请详细说明此实验在设计及运行时遇到的问题和解决办法,及实验体会及建议。
6. 给出客户端和服务器端详细代码和注释。
客户端总体代码:WSADATA wsaData;int err = 0 ,rval = 0 ;SOCKET fd;struct sockaddr_in servaddr;struct hostent* hp;char buf[1024] = "";wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("Can not create socket!");exit(2);}servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);hp = gethostbyname("169.254.65.108"); memcpy((char*)&servaddr.sin_addr, (char*)hp->h_addr,hp->h_length);memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));if (rval < 0)printf("Can not create connect!");exit(3);}else{ for(;;){memset(buf, 0, 1024);printf("Please input a line to server:");scanf("%s",&buf);rval = send(fd, buf, strlen(buf) + 1,0);if(rval < 0)printf("Write error!");if((rval=recv(fd,buf,sizeof(buf),0)<0))perror("reading stream message");if(rval==0)printf("server said :%s\n",buf);}}closesocket(fd);exit(5);}服务器端总体代码:int _tmain(int argc, _TCHAR* argv[]){SOCKET sock, msgsock;int length = 0;struct sockaddr_in server;struct sockaddr tcpaddr;char buf[1024] = "";int rval= 0, len= 0, err = 0;WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return -1;sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0){perror("opening stream socket");exit(1);}server.sin_family = AF_INET;server.sin_port = htons(MYPORT);server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR);memset(server.sin_zero, 0, sizeof(server.sin_zero));rval = bind(sock, (struct sockaddr *)&server, sizeof(server));if (rval < 0){perror("binding stream socket");exit(1);}length = sizeof(server);if (getsockname(sock, (struct sockaddr *)&server, &length) < 0) {perror("getting socket name");exit(1);}printf("socket port #%d\n", ntohs(server.sin_port));listen(sock, 5);len = sizeof(struct sockaddr);do{ msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);if (msgsock == -1)perror("accept");else{for(;;){memset(buf, 0, sizeof(buf));if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))perror("reading stream message");if (rval == 0)printf("client said :%s\n",buf);printf("server-->");scanf("%s",&buf);rval=send(msgsock,buf,strlen(buf)+1,0);}}closesocket(msgsock);} while (TRUE);closesocket(msgsock);return 0;}。