设为首页 加入收藏

TOP

2.1.2 小试牛刀--模拟实现Windows的TCP程序(5)
2013-10-07 15:53:49 来源: 作者: 【 】 浏览:83
Tags:2.1.2 小试牛刀 模拟 实现 Windows TCP 程序

2.1.2  小试牛刀--模拟实现Windows的TCP程序(5)

⑤ 服务模块

此模块的功能是通过函数Service()实现的,功能是实现接收、判断来自客户端的数据,并发送数据到客户端。具体代码如下:

  1. /*服务函数*/  
  2. void Service(LPVOID lpv)  
  3. {  
  4. SOCKET acceptfd = (SOCKET)lpv;  
  5. const char *msg = "HELLO CLIENT";  
  6. char response[4096];  
  7.  
  8. /*用0初始化response[4096]数组*/  
  9. memset(response, 0, sizeof(response));  
  10. /*接收数据,存入response中*/  
  11. recv(acceptfd, response, sizeof(response), 0);  
  12.  
  13. /*如果接收到的数据和预定义的数据不同*/  
  14. if (strcmp(response, "HELLO SERVER"))   
  15. {  
  16. printf("Application:  client not using expected "  
  17. "protocol %s\n", response);  
  18. }  
  19. else  
  20. /*发送服务器端信息到客户端*/  
  21. send(acceptfd, msg, strlen(msg)+1, 0);  
  22. /*关闭套接字*/  
  23. closesocket(acceptfd);  
  24. }  

⑥ 主函数模块

主函数是整个程序的入口,里面实现了套接字的创建、绑定、侦听和释放等操作,并且实现了对各个功能函数的调用。具体代码如下:

  1. /*主函数*/  
  2. int main(int argc, char **argv)  
  3. {  
  4. SOCKET listenfd;  
  5. int err;  
  6. struct sockaddr_in serverAddr;  
  7. struct hostent *ptrHost;  
  8. initial();  
  9. GetArgments(argc, argv);  
  10. InitSockets();  
  11. /*创建TCP流套接字,在domain参数为PF_INET的SOCK_STREAM的
    套接口中,protocol参数为0意味着告诉内核选择IPPRPTP_TCP,
    这也意味着套接口将使用TCP/IP协议*/  
  12. listenfd = socket(PF_INET, SOCK_STREAM, 0);  
  13. /*如果创建套接字失败*/  
  14. if (listenfd == INVALID_SOCKET)  
  15. {  
  16. printf("Error: out of socket resources\n");  
  17. return 1;  
  18. }  
  19.  
  20. /*如果是IP地址*/  
  21. if (atoi(hostName))   
  22. {  
  23. /*将IP地址转换成32二进制表示法,返回32位二进制的网络字节序*/  
  24. u_long ip_addr = inet_addr(hostName);  
  25. /*根据IP地址找到与之匹配的主机名*/  
  26. ptrHost = gethostbyaddr((char*)&ip_addr,  
  27.                       sizeof(u_long), AF_INET);  
  28. }  
  29. /*如果是主机名*/  
  30. else  
  31. /*根据主机名获取一个指向hosten的指针,该结构中包含了该主机所有的IP地址*/  
  32. ptrHost = gethostbyname(hostName);  
  33.  
  34. /*如果解析失败*/  
  35. if (!ptrHost)  
  36. {  
  37. ErrorPrint("cannot resolve hostname");  
  38. return 1;  
  39. }  
  40.  
  41. /*设置服务器地址*/  
  42. /*设置地址族为PF_INET*/  
  43. serverAddr.sin_family = PF_INET;  
  44. /*将一个通配的Internet地址转换成无符号长整型的网络字节序数*/  
  45. serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  46. /*将端口号转换成无符号短整型的网络字节序数*/  
  47. serverAddr.sin_port = htons(port);  
  48.  
  49. /*将套接字与服务器地址绑定*/  
  50. err = bind(listenfd, (const struct sockaddr *) &serverAddr,  
  51.                sizeof(serverAddr));  
  52. /*如果绑定失败*/  
  53. if (err == INVALID_SOCKET)  
  54. {  
  55. ErrorPrint("Error: unable to bind socket\n");  
  56. return 1;  
  57. }  
  58.  
  59. /*开始侦听,设置等待连接的最大队列长度为SOMAXCONN,默认值为5个*/  
  60. err = listen(listenfd, SOMAXCONN);  
  61. /*如果侦听失败*/  
  62. if (err == INVALID_SOCKET)  
  63. {  
  64. ErrorPrint("Error: listen failed\n");  
  65. return 1;  
  66. }  
  67.  
  68. LoopControl(listenfd, 1);  
  69. printf("Server is down\n");  
  70. /*释放Winscoket初始化时占用的资源*/  
  71. WSACleanup();  
  72. return 0;  
  73. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.1.2 小试牛刀--模拟实现Windows.. 下一篇2.1.2 小试牛刀--模拟实现Windows..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)