tcp.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #ifndef _TCP_H
  2. #define _TCP_H
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <strings.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <errno.h>
  12. #include "debug.h"
  13. #include "mychat.h"
  14. #define BACKLOG 5
  15. /* 信息检测 */
  16. extern char tcp_info_check(struct sockaddr_in *sin)
  17. {
  18. char ip[16];
  19. u_short port;
  20. inet_ntop(AF_INET, (void *)&(sin->sin_addr.s_addr), ip, sizeof(ip));
  21. port = ntohs(sin->sin_port);
  22. pr_debug("信息检测地址:%s:%d\n", ip, port);
  23. return 1;
  24. }
  25. /* 接收到(IP, 端口, 客户信息, 内容) */
  26. extern char tcp_recv_from(char *ip, int port, struct sockaddr_in *cin, char *str)
  27. {
  28. int ret = -1;
  29. struct sockaddr_in sin;
  30. int tcp_recv_fd;
  31. int tcp_newfd;
  32. tcp_recv_fd = socket(AF_INET, SOCK_STREAM, 0);
  33. // int enable = 1;
  34. // setsockopt(tcp_recv_fd, SOL_tcp_recv_fd, SO_REUSEADDR, &enable, sizeof(int));
  35. // int nNetTimeout=1000;//1秒
  36. //发送时限
  37. // setsockopt(tcp_recv_fd, SOL_SOCKET, SO_SNDTIMEO, &nNetTimeout, sizeof(int));
  38. //接收时限
  39. // setsockopt(tcp_recv_fd, SOL_SOCKET, SO_RCVTIMEO, &nNetTimeout, sizeof(int));
  40. sin.sin_family = AF_INET;
  41. sin.sin_port = htons(port);
  42. sin.sin_addr.s_addr = inet_addr(ip);
  43. bzero(sin.sin_zero, 8);
  44. ret = bind(tcp_recv_fd, (struct sockaddr*)&sin, sizeof(sin));
  45. if (ret < 0) {
  46. perror("tcp_recv_from->bind\nError:");
  47. tcp_info_check(&sin);
  48. return ret;
  49. }
  50. listen(tcp_recv_fd, BACKLOG);
  51. char buf[BUFSIZ];
  52. struct sockaddr cin_in;
  53. socklen_t addrlen = sizeof(cin_in);
  54. tcp_newfd = accept(tcp_recv_fd, &cin_in, &addrlen);
  55. if (tcp_newfd < 0) {
  56. perror("tcp_recv_from->accept\nError:");
  57. return ret;
  58. }
  59. else
  60. {
  61. bzero(buf, BUFSIZ);
  62. recv(tcp_newfd, buf, BUFSIZ, 0);
  63. buf[BUFSIZ-1] = '\0';
  64. memcpy(str, &buf, BUFSIZ);
  65. memcpy(cin, &cin_in, sizeof(struct sockaddr_in));
  66. }
  67. close(tcp_recv_fd);
  68. return 1;
  69. }
  70. /* 发送(IP,端口,信息) */
  71. extern char tcp_send_to(char *ip, unsigned int port, char *str, int size_str)
  72. {
  73. int ret = -1;
  74. struct sockaddr_in cin;
  75. int tcp_send_fd;
  76. tcp_send_fd = socket(AF_INET, SOCK_STREAM, 0);
  77. // int enable = 1;
  78. // setsockopt(tcp_recv_fd, SOL_tcp_recv_fd, SO_REUSEADDR, &enable, sizeof(int));
  79. // int nNetTimeout=1000;//1秒
  80. //发送时限
  81. // setsockopt(tcp_send_fd, SOL_SOCKET, SO_SNDTIMEO, &nNetTimeout, sizeof(int));
  82. //接收时限
  83. // setsockopt(tcp_send_fd, SOL_SOCKET, SO_RCVTIMEO, &nNetTimeout, sizeof(int));
  84. cin.sin_family = AF_INET;
  85. cin.sin_port = htons(port);
  86. cin.sin_addr.s_addr = inet_addr(ip);
  87. bzero(cin.sin_zero, 8);
  88. ret = connect(tcp_send_fd, (struct sockaddr*)&cin, sizeof(cin));
  89. if (ret < 0) {
  90. perror("tcp_send_to->connect\nError:");
  91. tcp_info_check(&cin);
  92. return ret;
  93. }
  94. ret = send(tcp_send_fd, str, size_str, 0);
  95. if (ret < 0) {
  96. perror("tcp_send_to->send\nError:");
  97. return ret;
  98. }
  99. close(tcp_send_fd);
  100. return 1;
  101. }
  102. /* 接收到(地址, 客户信息, 内容) */
  103. extern int tcp_addr_ini(struct sockaddr_in *sin)
  104. {
  105. int ret = -1;
  106. int tcp_recv_addr_fd;
  107. tcp_recv_addr_fd = socket(AF_INET, SOCK_STREAM, 0);
  108. // int enable = 1;
  109. // setsockopt(tcp_recv_addr_fd, SOL_tcp_recv_fd, SO_REUSEADDR, &enable, sizeof(int));
  110. // int nNetTimeout=1000;//1秒
  111. //发送时限
  112. // setsockopt(tcp_recv_addr_fd, SOL_SOCKET, SO_SNDTIMEO, &nNetTimeout, sizeof(int));
  113. //接收时限
  114. // setsockopt(tcp_recv_addr_fd, SOL_SOCKET, SO_RCVTIMEO, &nNetTimeout, sizeof(int));
  115. ret = bind(tcp_recv_addr_fd, (struct sockaddr*)sin, sizeof(struct sockaddr_in));
  116. if (ret < 0) {
  117. perror("tcp_addr_ini->bind\nError:");
  118. tcp_info_check(sin);
  119. return ret;
  120. }
  121. listen(tcp_recv_addr_fd, BACKLOG);
  122. return tcp_recv_addr_fd;
  123. }
  124. /************************(addr, 客户信息, 内容)***************************************/
  125. /* 接收到(地址, 客户信息, 内容) */
  126. extern char tcp_addr_recv_from(int tcp_recv_addr_fd, struct sockaddr_in *cin, struct msg_tcp *msg)
  127. {
  128. int ret = -1;
  129. int tcp_addr_newfd;
  130. struct sockaddr cin_in;
  131. struct msg_tcp msg_buf;
  132. socklen_t addrlen = sizeof(cin_in);
  133. tcp_addr_newfd = accept(tcp_recv_addr_fd, &cin_in, &addrlen);
  134. if (tcp_addr_newfd < 0) {
  135. perror("tcp_addr_ini->accept\nError:");
  136. return tcp_addr_newfd;
  137. }
  138. memcpy(cin, &cin_in, sizeof(struct sockaddr_in));
  139. ret = recv(tcp_addr_newfd, &msg_buf, sizeof(msg_buf), 0);
  140. if (ret < 0) //真正出错了
  141. {
  142. perror("tcp_addr_recv_from");
  143. return ret;
  144. }
  145. memcpy(msg, &msg_buf, sizeof(msg_buf));
  146. close(tcp_addr_newfd);
  147. return 1;
  148. }
  149. /* 发送(地址,信息, 大小) */
  150. extern char tcp_addr_send_to(struct sockaddr_in *cin, struct msg_tcp *msg, int msgsize)
  151. {
  152. int ret = -1;
  153. int tcp_send_addr_fd;
  154. tcp_send_addr_fd = socket(AF_INET, SOCK_STREAM, 0);
  155. // int nNetTimeout=1000;//1秒
  156. //发送时限
  157. // setsockopt(tcp_send_addr_fd, SOL_SOCKET, SO_SNDTIMEO, &nNetTimeout, sizeof(int));
  158. //接收时限
  159. // setsockopt(tcp_send_addr_fd, SOL_SOCKET, SO_RCVTIMEO, &nNetTimeout, sizeof(int));
  160. ret = connect(tcp_send_addr_fd, (struct sockaddr*)cin, sizeof(struct sockaddr_in));
  161. if (ret < 0) {
  162. perror("tcp_addr_send_to->connect\nError:");
  163. tcp_info_check(cin);
  164. return ret;
  165. }
  166. ret = send(tcp_send_addr_fd, msg, msgsize, 0);
  167. if (ret < 0) {
  168. perror("tcp_addr_send_to->send\nError:");
  169. return ret;
  170. }
  171. close(tcp_send_addr_fd);
  172. return 1;
  173. }
  174. #endif