swtcp.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /************************************************************************
  2. * AUTHOR: NiuJiuRu
  3. * FILENAME: swtcp.c
  4. * DESCRIPTION: TCP socket
  5. * NOTE:
  6. * HISTORY:
  7. * 1, [2010-11-30] created by NiuJiuRu
  8. ***********************************************************************/
  9. #include "swapi.h"
  10. #include "swtcp.h"
  11. /* 创建一个tcp socket */
  12. int sw_tcp_socket()
  13. {
  14. return socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
  15. }
  16. /* 关闭一个tcp socket */
  17. void sw_tcp_close(int skt)
  18. {
  19. closesocket(skt);
  20. }
  21. /* 连接远端 */
  22. int sw_tcp_connect(int skt, unsigned int ip, unsigned short port)
  23. {
  24. struct sockaddr_in addr;
  25. addr.sin_family = AF_INET;
  26. addr.sin_addr.s_addr = ip;
  27. addr.sin_port = port;
  28. return connect(skt, (struct sockaddr *)&addr, sizeof(addr));
  29. }
  30. /* 绑定接收地址和端口, sever使用bind()与本机绑定, client使用connect()与远程主机连接 */
  31. int sw_tcp_bind(int skt, unsigned int ip, unsigned short port)
  32. {
  33. struct sockaddr_in addr;
  34. addr.sin_family = AF_INET;
  35. addr.sin_addr.s_addr = ip;
  36. addr.sin_port = port;
  37. return bind(skt, (struct sockaddr *)&addr, sizeof(addr));
  38. }
  39. /* 开始监听, max为处理连接的队列长度, 建议设置为: SOMAXCONN */
  40. int sw_tcp_listen(int skt, int max)
  41. {
  42. return listen(skt, max);
  43. }
  44. /* 等待远程连接(从连接队列中读取第一个已完成的连接, 队列长度减一) */
  45. int sw_tcp_accept(int skt, unsigned int *ip, unsigned short *port)
  46. {
  47. struct sockaddr_in from;
  48. unsigned int slen = sizeof(from);
  49. skt = accept(skt, (struct sockaddr *)&from, &slen);
  50. if(0 <= skt)
  51. {
  52. if(ip) *ip = from.sin_addr.s_addr;
  53. if(port) *port = from.sin_port;
  54. }
  55. return skt;
  56. }
  57. /* 发送数据 */
  58. int sw_tcp_send(int skt, const char *buf, int send_len)
  59. {
  60. return send(skt, buf, send_len, 0);
  61. }
  62. /* 接收数据 */
  63. int sw_tcp_recv(int skt, char *buf, int buf_size)
  64. {
  65. return recv(skt, buf, buf_size, 0);
  66. }
  67. /* 配置tcp socket */
  68. int sw_tcp_ioctl(int skt, int type, unsigned long *val)
  69. {
  70. return ioctlsocket(skt, (long)type, val);
  71. }
  72. /* 检测tcp socket的状态, timeout单位为ms */
  73. int sw_tcp_select(int skt, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, int timeout)
  74. {
  75. struct timeval tv = { 0 };
  76. if(readfds)
  77. {
  78. FD_ZERO(readfds);
  79. FD_SET((unsigned int)skt, readfds);
  80. }
  81. if(writefds)
  82. {
  83. FD_ZERO(writefds);
  84. FD_SET((unsigned int)skt, writefds);
  85. }
  86. if(exceptfds)
  87. {
  88. FD_ZERO(exceptfds);
  89. FD_SET((unsigned int)skt, exceptfds);
  90. }
  91. if(0 <= timeout)
  92. {
  93. tv.tv_sec = timeout/1000;
  94. tv.tv_usec = (timeout%1000)*1000;
  95. return select(skt+1, readfds, writefds, exceptfds, &tv);
  96. }
  97. else
  98. return select(skt+1, readfds, writefds, exceptfds, NULL);
  99. }