当前位置:首页 > 计算机网络技术实验指导书
图5-3 server及client编程流程
2、实验步骤
两个同学作为一组,一个同学的PC作服务器,一个同学的PC作客户端。 (1)服务器端PC实验进行步骤:
1)按照附录建立server项目工程文件;;
2)编译连接以生成server.exe:选择Build->Build server.exe或Rebuild all选项(或者按下F7键盘按键),VC即自动执行编译连接工作;
3)在所生成的server文件夹中的Debug文件夹中,把可执行文件server复制到一分区盘的根目录下(如D盘),在MS-DOS窗口中,在对应路径下执行server:
4)程序执行后即进入等待客户连接的状态,此时等待客户端PC连接即可;
5)客户端PC执行程序连接后,窗口会有相应结果显示,此时分别记录服务器端、客户端的程序运行实验结果。
6)阅读源代码server.c和client.c,结合实验结果理解总结网络编程的基本模式;
7)理解源代码的基础上进行扩展练习:在代码中改动服务器端端口配置,给服务器一个确定端口号的端口 。改动server.c后重新编译连接以生成server.exe(见上面的2)说明),待客户端PC改动client.c后按照以上步骤3)、4)、5)重新执行应用程序。
43
**参考代码:server.sin_port = htons(atoi(\
**htons的作用--The htons function converts a u_short from host to TCP/IP network byte order
**atoi的作用--Convert strings to integer
(2)客户端PC实验进行步骤:
1)与建立server项目工程文件步骤类似,按照附录建立client项目工程文件;
2) 编译连接以生成client.exe:选择Build->Build client.exe或Rebuild
all选项(或者按下F7键盘按键),VC即自动执行编译连接工作; 3) 在client文件夹中的Debug文件夹中,把可执行文件client复制到一分区盘的根目录下(如D盘)。询问服务器端PC的IP地址和运行后server.exe后所打印出的端口号以备执行client时作参数使用。在MS-DOS窗口中,在对应路径下执行程序,命令行格式为:client 服务器IP地址 服务器端口号
4)执行程序后出现Input sending information的提示;此时通过键盘输入要发送的信息,输完后按回车键结束即可;
5)发送后记录本机发送信息和在服务器端出现的实验结果。
6)阅读源代码server.c和client.c,结合实验结果理解总结网络编程的基本模式;
7)理解源代码的基础上进行扩展练习:
a. 在程序代码中指定确定的服务器IP地址,以省去以命令行运行时的服务器IP地址选项,使改动后运行客户端程序命令为:client 服务器端口号。改动client.c后重新编译连接以生成client.exe(见上面的2)说明),待服务器端的server.exe执行后按照以上步骤3)、4)、5)重新执行应用程序。
**参考代码:server.sin_addr.s_addr=inet_addr(atoi(\另需把设置端口号的代码argv[2]改为argv[1]
b. 在服务器端指定确定的端口号后,试在代码中指定连接的确定服务器端
口号,以进一步省去以命令行运行时的服务器端口号选项,即改动后运行客户端程序命令为:client
**参考代码:server.sin_port = htons(atoi(\
【附录】使用VC创建server和client项目文件的步骤
1、启动Visual Studio 6.0中的Vc6.0;
2、选择File(文件)->New(新建)->Project; 3、选择Win32 console application;
44
4、选择要创建此工程项目的位置,在Project name中输入server,VC会在相应路径下建立一server的文件夹以包括所有此项目的文件,选择OK;
5、在跳出的对话框中选择an empty project,以生成不包括任何源文件的工程项目;
6、新建源代码文件server.c:选择File->New->Files->C++ source File,输入文件名server.c,单击OK确定,并在文件中输入服务器端代码: #include
/* 这个程序建立一个套接字,然后开始无限循环;*/
/*每当它通过循环接收到一个连接,则打印出一个信息。*/
/*当连接断开,或接收到终止信息,则此连接结束,程序再接收一个新的连接。*/
/*命令行的格式是:server */ main( ) {
int sock, length;
struct sockaddr_in server; struct sockaddr tcpaddr; int msgsock; char buf[1024]; int len;
/* 建立套接字 */
WORD wVersionRequested; WSADATA wsaData; int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData ); //初始化套接字环境 sock = socket(AF_INET, SOCK_STREAM, 0); //创建套接字 if (sock < 0) {
perror(\ exit(1); }
/* 使用任意端口命名套接字 */
server.sin_family = AF_INET; //使用协议,此处为IP协议
server.sin_port = INADDR_ANY; //服务器监听端口,此处定义为任意可用端口
server.sin_addr.s_addr=INADDR_ANY; //服务器使用IP地址,此处定义为任意可以IP地址
if (bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { perror(\ exit(1); }
/* 找出指定的端口号并打印出来,若上面定义服务器端口时指定一确定值则
45
可不用此段代码 */
length = sizeof(server);
if (getsockname(sock, (struct sockaddr *)&server, &length) < 0) { perror(\ exit(1); }
printf(\ /* 开始接收连接 */ listen(sock, 5);
len = sizeof(struct sockaddr); do { msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len); //等待客户端连接请求,阻塞直到有请求来为止 printf(\和一个客户端建立了一个新的连接 memset(buf, 0, sizeof(buf)); //初始化缓冲区(全部置0) recv(msgsock, buf,sizeof(buf),0); //接收客户端来的信息
printf(\ //打印接收到的信息 closesocket(msgsock); } while (TRUE);
/* 因为这个程序已经有了一个无限循环,所以套接字\从来不显式关闭。然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。*/ exit(0); }
7、把server.c加入此工程项目中:选择Project->add to project->Files ,在弹出的对话框中找到server.c,选中此文件,点击加入即可。
8、加入支持winsock的链接库:选择Project->settings,在弹出的对话框中选择link属性设置界面,在界面中的object/library modules中的最后输入加入的库文件Ws2_32.lib,选择OK返回。
9、编译连接以生成server.exe:选择Build->Build server.exe或Rebuild all选项,VC即自动执行编译连接工作。
10、 可执行程序即在生成的server文件夹中的Debug文件夹中。
使用VC编译连接client过程与此相同。其中client.c文件代码如下: #include
/* 此客户端程序与服务器进行连接,并发送键盘输入的信息到服务器*/ /*命令行运行格式为:client 服务器IP地址 端口号*/ main(argc, argv) int argc;
char *argv[ ]; {
int sock; WORD wVersionRequested; WSADATA wsaData;
struct sockaddr_in server;
46
char data[1024]; printf(\ gets(data); //用键盘输入发送的信息 // 建立套接字 wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData ); //初始化套接字环境
sock = socket(AF_INET, SOCK_STREAM, 0); //创建套接字 /* 使用命令行中指定的名字连接套接字 */ server.sin_family = AF_INET;
server.sin_addr.s_addr=inet_addr(argv[1]); //连接的服务器IP地址 server.sin_port = htons(atoi(argv[2])); //连接的服务器端口地址 connect(sock, (struct sockaddr*)&server, sizeof(server)); //发起连接
send(sock, data, sizeof(data),0); //发送数据到服务器 closesocket(sock); //关闭套接字 exit(0); }
五、实验报告要求
1、简述实验目的和实验原理;
2、详细描述实验过程,分析实验结果。 3、思考并回答以下问题:
端口的作用是什么?在本实验中是如何体现端口的作用的? 4、总结本实验主要结论。
47
共分享92篇相关文档