CComm.cpp
上传用户:eedlbz
上传日期:2020-07-24
资源大小:279k
文件大小:3k
源码类别:

SCSI/ASPI

开发平台:

Visual C++

  1. #include "CComm.h"
  2. CComm::CComm()
  3. {
  4. //构造函数
  5. ListenSocket = INVALID_SOCKET; // 开始设置为INVALID_SOCKET
  6. #ifdef _WIN32 // 如果是win32系统
  7. WORD VersionRequested = MAKEWORD(1,1);
  8. WSADATA wsaData;
  9. WSAStartup(VersionRequested, &wsaData); // 启动winsock服务
  10. if ( wsaData.wVersion != VersionRequested )
  11. {
  12. printf("Wrong version or WinSock not loadedn");
  13. fflush(0);
  14. }
  15. #endif
  16. }
  17. //析构函数
  18. CComm::~CComm()
  19. {
  20. if ( ListenSocket != INVALID_SOCKET )
  21. closesocket( ListenSocket ); // 如果已经创建、则关闭
  22. #ifdef _WIN32 // 调用WSACleanup
  23. WSACleanup();
  24. #endif
  25. }
  26. bool CComm::SendMsg( char *Msg, int Len, char *host, short port )
  27. {
  28. signed int Sent;
  29. hostent *hostdata;
  30. if ( atoi(host) ) // 是否IP地址为标准形式
  31. {
  32. u_long ip = inet_addr( host );
  33. hostdata = gethostbyaddr( (char *)&ip, sizeof(ip), PF_INET );
  34. }
  35. else // 否则则可能是机器名
  36. {
  37. hostdata = gethostbyname( host );
  38. }
  39. if ( !hostdata )
  40. {
  41. printf("获得机器名错误n");
  42. fflush(0);
  43. return false;
  44. }
  45. sockaddr_in dest; // 发送目标地址
  46. dest.sin_family = PF_INET;
  47. dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]);
  48. dest.sin_port = htons( port );
  49. printf("信息已经被发送到主机 %s 端口为 %in", inet_ntoa(dest.sin_addr), ntohs(dest.sin_port));
  50. //数据发送
  51. Sent = sendto(ListenSocket, Msg, Len, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
  52. if ( Sent != Len )
  53. {
  54. printf("错误发送UDP信息n");
  55. fflush(0);
  56. return false;
  57. }
  58. return true;
  59. }
  60. void *CComm::ListenThread( void *data )
  61. {
  62. char buf[4096];
  63. CComm *Comm = (CComm *)data;
  64. int len = sizeof(Comm->client);
  65. while(1) // 一直循环
  66. {
  67. //接收数据
  68. int result = recvfrom( Comm->ListenSocket, buf, sizeof(buf)-1, 0, (sockaddr *)&Comm->client, (socklen_t *)&len);
  69. if ( result > 0 )
  70. {
  71. buf[result] = 0;
  72. printf("Message received from host %s port %in", inet_ntoa(Comm->client.sin_addr), ntohs(Comm->client.sin_port));
  73. printf(">> %s", buf);
  74. fflush(0);
  75. }
  76. }
  77. }
  78. //地址绑定,注意在UDP协议中,不需要listen,这里函数listen只是绑定一个端口
  79. bool CComm::Listen( int PortNum )
  80. {
  81. ListenSocket = socket(PF_INET, SOCK_DGRAM, 0);
  82. if ( ListenSocket == INVALID_SOCKET )
  83. {
  84. printf("Error: socket创建失败n");
  85. fflush(0);
  86. return false;
  87. }
  88. srv.sin_family = PF_INET;
  89. srv.sin_addr.s_addr = htonl( INADDR_ANY ); // 任何地址
  90. srv.sin_port = htons( PortNum );
  91. if ( bind( ListenSocket, (struct sockaddr *)&srv, sizeof(srv)) != 0 )
  92. {
  93. printf("Error: 绑定失败n");
  94. fflush(0);
  95. closesocket( ListenSocket );
  96. return false;
  97. }
  98. int ThreadID; // 线程id
  99. DWORD thread;
  100. //调用createthread创建线程
  101. ThreadID = (int)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(CComm::ListenThread), (void *)this, 0, &thread);
  102. ThreadID = ThreadID ? 0 : 1; // 如果成功,则返回为0
  103. if(ThreadID) // ThreadID如果不为0,则线程创建失败
  104. {
  105. printf("线程创建失败n");
  106. return false;
  107. }
  108. else
  109. return true;
  110. }