You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tcpserver.cpp 1.6 kB

8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "tcpserver.h"
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <arpa/inet.h>
  6. #include <thread>
  7. #include <unistd.h>
  8. using namespace std;
  9. TcpServer::TcpServer()
  10. {
  11. }
  12. bool TcpServer::start(int port)
  13. {
  14. if (mStarted)
  15. return true;
  16. mSocket = socket(AF_INET, SOCK_STREAM, 0);
  17. if (mSocket == -1)
  18. {
  19. perror("create tcp socket failed: %s");
  20. return false;
  21. }
  22. int val = 1;
  23. setsockopt(mSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
  24. sockaddr_in addr;
  25. addr.sin_family = AF_INET;
  26. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  27. addr.sin_port = htons(port);
  28. int ret = ::bind(mSocket, (sockaddr*)&addr, sizeof(addr));
  29. if (ret == -1)
  30. {
  31. perror("bind failed");
  32. return false;
  33. }
  34. ret = listen(mSocket, 5);
  35. if (ret == -1)
  36. {
  37. perror("listen failed");
  38. return false;
  39. }
  40. mStarted=true;
  41. thread thd(&TcpServer::keepAccept, this);
  42. thd.detach();
  43. return true;
  44. }
  45. void TcpServer::whenNewClient(TcpServer::ClientHandler onClientConnected)
  46. {
  47. mClientHandler = onClientConnected;
  48. }
  49. void TcpServer::stop()
  50. {
  51. mStarted = false;
  52. close(mSocket);
  53. }
  54. void TcpServer::keepAccept()
  55. {
  56. while (mStarted) {
  57. sockaddr_in addr;
  58. socklen_t len = sizeof(addr);
  59. int ret = ::accept(mSocket, (sockaddr*)&addr, &len);
  60. if (ret < 0)
  61. {
  62. perror("failed to accept");
  63. break;
  64. }
  65. if (mClientHandler)
  66. {
  67. mClientHandler(ret);
  68. }
  69. }
  70. }

mac下的“飞秋”大多数只是飞鸽传书协议,而且未发现令人满意的开源项目,所以基于c++与qt实现了基础的飞秋协议。

Contributors (1)