2.1.2 小试牛刀--模拟实现Windows的TCP程序(3)
② 初始化模块
此处的初始化分为全局变量初始化和Winsock初始化两部分,分别通过如下两个函数来实现:
initial():用于初始化全局变量,通过设置hostName="127.0.0.1",说明程序运行时仅限定客户端和服务器在同一台机器上。
InitSockets(void):用于初始化Winsock。
对应的代码如下:
- /*初始化全局变量函数*/
- void initial()
- {
- hostName = "127.0.0.1";
- maxService = 3;
- port = 9999;
- }
-
- /*初始化Winsocket函数*/
- int InitSockets(void)
- {
- WSADATA wsaData;
- WORD sockVersion;
- int err;
-
- /*设置Winsock版本号*/
- sockVersion = MAKEWORD(2, 2);
- /*初始化Winsock*/
- err = WSAStartup(sockVersion, &wsaData);
- /*如果初始化失败*/
- if (err != 0)
- {
- printf("Error %d: Winsock not available\n", err);
- return 1;
- }
- return 0;
- }
③ 功能控制模块
此模块提供了参数获取、错误输出和用户帮助等功能,上述功能分别通过如下3个函数实现:
GetArgments:用于获取用户提供的选项值。
ErrorPrint:用于输出错误。
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;
- /*最多服务次数*/
- case 'n':
- maxService = atoi(&argv[i][3]);
- break;
- /*其他情况*/
- default:
- userHelp();
- break;
- }
- }
- }
- return;
- }
-
- /*错误输出函数*/
- void ErrorPrint(x)
- {
- printf("Error %d: %s\n", WSAGetLastError(), x);
- }
-
- /*用户帮助函数*/
- void userHelp()
- {
- printf("userHelp: -h:str -p:int -n:int\n");
- printf(" -h:str The host name \n");
- printf(" The default host is 127.0.0.1\n");
- printf(" -p:int The Port number to use\n");
- printf(" The default port is 9999\n");
- printf(" -n:int The number of service,below MAX_SER \n");
- printf(" The default number is 3\n");
- ExitProcess(-1);
- }