2.1.2 小试牛刀--模拟实现Windows的TCP程序(6)
(2) 客户端
① 预处理
预处理包括文件导入、头文件加载、定义常量、定义变量等操作。具体代码如下:
- /*导入库文件*/
- #pragma comment(lib, "wsock32.lib")
- /*加载头文件*/
- #include <stdio.h>
- #include <winsock2.h>
-
- /*自定义函数*/
- int InitSockets(void);
-
- void GetArgument(int argc, char **argv);
- void ErrorPrint(x);
- void userHelp();
-
- /*定义全局变量*/
- unsigned short port;
- char *hostName;
② 初始化模块
初始化模块无需对全局变量赋值,只须实现对Winsock的初始化,包括初始化套接字版本号和加载Winsock库。具体代码如下:
- /*初始化Winsock函数*/
- 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;
- }
③ 功能控制模块
此模块提供了参数获取、错误输出和用户帮助等功能,上述功能分别通过如下函数来实现。
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;
- /*其他情况*/
- default:
- userHelp();
- break;
- }
- }
- }
- return;
- }
-
- /*错误输出函数*/
- void ErrorPrint(x)
- {
- printf("Error %d: %s\n", WSAGetLastError(), x);
- }
-
- /*用户帮助函数*/
- void userHelp()
- {
- printf("userHelp: -h:str -p:int\n");
- printf(" -h:str The host name \n");
- printf(" -p:int The Port number to use\n");
- ExitProcess(-1);
- }