klhttp-netbase.c
上传用户:jnmzc84
上传日期:2022-08-08
资源大小:35k
文件大小:3k
源码类别:

网络编程

开发平台:

Visual C++

  1. /**
  2.   @file klhttp-netbase.c
  3.   @author Kevin Lynx
  4.   @date 7.29.2008
  5.   @brief wrap the net module.
  6. */
  7. #include "klhttp-netbase.h"
  8. #ifdef WIN32
  9. #include <winsock2.h>
  10. #endif
  11. /**
  12.   malloc a fd_set on the heap, to make it dependent from FD_SETSIZE.
  13.   make sure fd_count > FD_SETSIZE.
  14. */
  15. #define NEW_FD_SET( fd_count ) 
  16. (struct fd_set*) malloc( sizeof( struct fd_set ) + sizeof( int ) * ( 
  17. fd_count - FD_SETSIZE > 0 ? fd_count - FD_SETSIZE : 0 ) )
  18. /**
  19.   bind address and listen.
  20. */
  21. static int _server_listen( int fd, const char *ip, unsigned short port )
  22. {
  23. int ret;
  24. struct sockaddr_in addr;
  25. memset( &addr, 0, sizeof( addr ) );
  26. addr.sin_family = AF_INET;
  27. addr.sin_port = htons( port );
  28. addr.sin_addr.s_addr = inet_addr( ip );
  29. ret = bind( fd, (struct sockaddr*) &addr, sizeof( addr ) );
  30. if( ret < 0 )
  31. {
  32. return -1;
  33. }
  34. /* the backlog */
  35. ret = listen( fd, 1024 );
  36. return ret;
  37. }
  38. /**
  39.   set fd set
  40. */
  41. static void _server_set_fd( struct tcp_server *server )
  42. {
  43. memcpy( server->fd_readset->fd_array, server->fd_set->fd_array, sizeof( server->fd_set->fd_array[0] ) * server->fd_set->fd_count );
  44. server->fd_readset->fd_count = server->fd_set->fd_count ;
  45. memcpy( server->fd_writeset->fd_array, server->fd_set->fd_array, sizeof( server->fd_set->fd_array[0] ) * server->fd_set->fd_count );
  46. server->fd_writeset->fd_count = server->fd_set->fd_count ;
  47. FD_SET( server->fd, server->fd_readset );
  48. }
  49. int ts_server_startup( struct tcp_server *server, const char *ip, unsigned short port, int max_con, read_write_cb read_cb, read_write_cb write_cb, void *arg )
  50. {
  51. int ret;
  52. server->fd = (int) socket( AF_INET, SOCK_STREAM, 0 );
  53. server->max_con = max_con;
  54. server->read_cb = read_cb;
  55. server->write_cb = write_cb;
  56. server->arg = arg;
  57. ret = _server_listen( server->fd, ip, port );
  58. if( ret < 0 )
  59. {
  60. closesocket( server->fd );
  61. return -1;
  62. }
  63. /* malloc the fd set */
  64. server->fd_readset = NEW_FD_SET( max_con );
  65. server->fd_writeset = NEW_FD_SET( max_con );
  66. server->fd_set = NEW_FD_SET( max_con );
  67. FD_ZERO( server->fd_readset );
  68. FD_ZERO( server->fd_writeset );
  69. FD_ZERO( server->fd_set );
  70. return 0;
  71. }
  72. void ts_server_cleanup( struct tcp_server *server )
  73. {
  74. closesocket( server->fd );
  75. /* free memory then */
  76. free( server->fd_readset );
  77. free( server->fd_writeset );
  78. free( server->fd_set );
  79. }
  80. int ts_server_poll( struct tcp_server *server, struct timeval *timeout )
  81. {
  82. unsigned int i;
  83. int ret ;
  84. /* reset the fd set */
  85. _server_set_fd( server );
  86. ret = select( 0, server->fd_readset, server->fd_writeset, 0, timeout );
  87. if( ret <= 0 )
  88. {
  89. return ret;
  90. }
  91. /* write first and read later can avoid some bugs */
  92. for( i = 0; i < server->fd_writeset->fd_count; ++ i )
  93. {
  94. server->write_cb( (int)server->fd_writeset->fd_array[i], server->arg );
  95. }
  96. for( i = 0; i < server->fd_readset->fd_count; ++ i )
  97. {
  98. server->read_cb( (int)server->fd_readset->fd_array[i], server->arg );
  99. }
  100. return ret;
  101. }