2.1.2 小试牛刀--模拟实现Windows的TCP程序(7)
④ 数据传输控制模块
客户端程序会把数据的传入传出部分放在主函数中执行,也就是说此处的数据传输功能是通过主函数实现的。主函数中包括套接字创建、绑定和释放,并实现对服务器连接、数据发送、数据接收等各个模块的调用。具体实现代码如下:
- /*主函数*/
- 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;
- }
到此为止,整个实例设计完毕,编译执行后的效果如图2-6所示。
|
| 图2-6 执行效果 |