c语言初始化字符串 函数 manment,TCP程序设计(c语言课程设计).doc

#include /*自定义函数*/

int InitSockets(void);

void GetArgument(int argc, char **argv);

void ErrorPrint(x);

void userHelp();

/*定义全局变量*/

unsigned short port;

char *hostName;

2) 初始化模块

因为不存在对全局变量赋初始值,所以客户端的初始化模块仅仅初始化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;

}

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("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);

}

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 = "HELLO SERVER";

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("no more socket resources");

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("cannot resolve hostname");

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("cannot connect to server");

return 1;

}

/*连接成功后,输出信息*/

printf("You are connected to the server\n");

/*发送消息到服务器端*/

send (clientfd, msg, strlen(msg)+1, 0);

memset(response, 0, sizeof(response));

/*接收来自服务器端的消息*/

recv(clientfd, response, sizeof(response), 0);

printf("server says %s\n", response);

/*关闭套接字*/

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>

图10。8 服务器未启动时启动客户端

如图10。9所示,客户端以“-h:127.0.01 –p:88 ”启动,由于服务器端的端口号是“9999”,所以这里不能正确连接。

C:\WINDOWS\system32\cmd.exe

E:\book\str\chap10\tcp_clieng\Debug\tcp_client.exe –h:127.0.0.1 –p:888

Error 10061:cannot connect to server

E:\book\str\chap10\tcp_client\Debug>

图10。9 带不正确的端口号启动客户端

如图10。10所示,客户端以“-h:127.0.0.2 –p:9999”启动,虽然端口号正确,但是服务器端的IP地址不正确,所以也不能正确连接。

C:\WINDOWS\system32\cmd.exe

E:\book\src\chap10\tcp_client\Debug>tcp_client.exe –h:127.0.02 –P:9999

Error 11004: cannot resolve hostname

E:\book\src\chap10\tcp_client\Debug>_

图 10.10 带不正确的IP地址启动客户端

如图10.11所示,客户端以“-h:kkk –P:9999”启动,虽然端口正确,但是服务器端的主机名不正确,所以仍然不然正确连接

C:\WINDOWS\system32\cmd.exe

E:\book\src\chap10\tcp_client\Debug>tcp_client

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值