TCP程序设计(c语言课程设计)(4)

2019-03-03 14:19

/*设置Winsock版本号*/ sockVersion = MAKEWORD( 2, 2 ); /*初始化Winsock*/ err = WSAStartup( sockVersion, &wsaData ); /*如果初始化失败*/ if ( err != 0 ) { printf(\ return 1; } return 0; } 3) 功能控制模块

功能控制模块包括选项获取功能、错误输出功能和用户帮助功能。这几个功能分别由GetArgment()函数、ErrorPrint()函数和userHelp()函数来实现,这几个函数和服务器端的函数功能、参数意义相同,在此就不再赘述。

(1) void GetArgment(int argc,char **argv),获取用户提供的选项。 (2) void ErrorPrint(x),输出错误信息。 (3) void userHelp(),显示用户帮助。

/*获取选项函数*/ void GetArgments(int argc, char **argv) { int i; for(i=1; i < argc ;i++) { /*参数的第一个字符若是“-”*/ if (argv[i][0] == '-') { /*转换成小写*/ switch (tolower(argv[i][1])) { /*若是端口号*/ case 'p': if (strlen(argv[i]) > 3) port = atoi(&argv[i][3]); break; /*若是主机名*/ case 'h': hostName = &argv[i][3]; break; /*其他情况*/ default: userHelp(); break; } } } return; } /*错误输出函数*/ void ErrorPrint(x) { printf(\} /*用户帮助函数*/ void userHelp() { printf(\ printf(\ printf(\ ExitProcess(-1); } 4) 数据传输控制模块

客户端程序把数据的输入输出部分都放在主函数中执行,即数据传输控制由主函数来实现。主函数中包括套接字的创建、绑定和释放,服务器的连接,数据的发送、接收以及对各个模块中函数的调用等。其具体操作流程图可参见图10.3。

/*主函数*/ int main(int argc, char **argv) { SOCKET clientfd; int err; struct sockaddr_in serverAddr; struct hostent *ptrHost; char response[4096]; char *msg = \ GetArgments(argc, argv); if (argc != 3) { userHelp(); return 1; } GetArgments(argc,argv); InitSockets(); /*创建套接字*/ clientfd = socket(PF_INET, SOCK_STREAM, 0); /*如果创建失败*/ if (clientfd == INVALID_SOCKET) { ErrorPrint(\ return 1; } /*根据IP地址解析主机名*/ if (atoi(hostName)) { u_long ip_addr = inet_addr(hostName); ptrHost = gethostbyaddr((char *)&ip_addr, sizeof(u_long), AF_INET); } /*根据主机名解析IP地址*/ else ptrHost = gethostbyname(hostName); /*如果解析失败*/ if (!ptrHost) { ErrorPrint(\ return 1; } /*设置服务器端地址选项*/ serverAddr.sin_family = PF_INET; memcpy((char *) &(serverAddr.sin_addr), ptrHost->h_addr,ptrHost->h_length); serverAddr.sin_port = htons(port); /*连接服务器*/ err = connect(clientfd, (struct sockaddr *) &serverAddr, sizeof(serverAddr)); /*连接失败*/ if (err == INVALID_SOCKET) { ErrorPrint(\ return 1; } /*连接成功后,输出信息*/ printf(\ /*发送消息到服务器端*/ send (clientfd, msg, strlen(msg)+1, 0); memset(response, 0, sizeof(response)); /*接收来自服务器端的消息*/ recv(clientfd, response, sizeof(response), 0); printf(\ /*关闭套接字*/ closesocket(clientfd); /*释放Winscoket初始化时占用的资源*/ WSACleanup(); return 0; } 提示: 由于在TC或者Win-TC中没有编译套接字的头文件,所以该程序需要在

Visual C++或者具有Winsock头文件的编译器中编译。本章的服务器端和客户端程序端都已经在Visual C++6.0中通过编译。 10.4.2 运行结果

本节将对服务器端和客户端从两个大方面进行测试,包括错误测试和带选项(带正确选项值)的测试。

1. 错误测试

由于服务器端可以不带选项进行启动,所以对服务器端的错误测试主要是带错误选项的测试;而客户端的错误测试包括不带选项启动、带不正确的端口号或者主机名启动,以及服务器未启动时启动客户端。 1) 服务器端选项错误

如图10。6所示,服务器端错误选项(“-1“)启动时,则会显示用户帮助信息(选项格式和类型),并终止程序。

C:\\WINDOWS\\system32\\cmd.exe E:\\book\\str\\chapt10\\tcp\\Debug>tcp.exe -1 userHelp: -h:str –p:int –n:int -h:str The host name The default host is 127.0.0.1 -p:int The Port number to use The default port is 9999 -n:int The number of service,below MAX_SER The default number is 3 E:\\book\\str\\chap10\\tcp\\Debug> 图10。6 带错误选项的服务器端启动

2) 客户端不带选项

客户端启动时必须带选项(服务器端IP地址或者主机名、端口号),如果不带选项启动则会出错并终止程序。如图10。7所示,不带选项启动客户端,将显示用户帮助信息(选项格式和类型)。

3) 服务器未启动时,启动客户端

如果未启动服务器时就启动客户端,将不能正确连接到服务端。如图10。8所示,不能连接到服务器端,并显示出错信息。 4) 客户端端口号或者主机名不正确 如果服务器端已经启动(这里已经以默认选项启动服务端,即服务器端IP地址为“127。0。0。1”,端口号为“9999”),但是客户端启动时端口号、服务器IP地址或主机名有一个不正确将不能正确连接到服务端。

C:\\WINDOWS\\system32\\cmd.exe E:\\book\\str\\chap10\\tcp_client\\Debug\\tcp_client.exe userHelp: -h:str –p:int -h:str The host name -p:int The Port number to use E:\\book\\str\\chap10\\tcp_client\\Debug> 图10。7 不带选项的客户端启动

C:\\WINDOWS\\system32\\cmd.exe E:\\book\\str\\chap10\\tcp_client.exe –h:127.0.0.1 –p:9999 Error 10061:cannot connent to server E:\\book\\str\\chap10\\tcp_client\\Debug>


TCP程序设计(c语言课程设计)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第四届“挑战杯”湖南工程学院大学生创业计划竞赛附件

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: