zoukankan      html  css  js  c++  java
  • LUA_TCP网络

    luaL_Buffer   从INIT开始到RESULT为止..栈的控制权在luaL_Buffer手里..不要动栈做修改..要修改也要平衡...添了就要删.

     1 BOOL APIENTRY DllMain( HMODULE hModule,
     2                        DWORD  ul_reason_for_call,
     3                        LPVOID lpReserved
     4                      )
     5 {
     6     WSADATA wsaData;
     7     WORD sockVersion;
     8 
     9     switch (ul_reason_for_call)
    10     {
    11     case DLL_PROCESS_ATTACH:
    12         sockVersion = MAKEWORD( 2, 2 );
    13         if ( WSAStartup( sockVersion, &wsaData ) != 0 )
    14         {
    15             return FALSE;
    16         }
    17 
    18         if ( wsaData.wVersion != sockVersion )
    19         {
    20             WSACleanup();
    21             return FALSE;;
    22         }
    23         break;
    24     case DLL_THREAD_ATTACH:
    25         break;
    26     case DLL_THREAD_DETACH:
    27         break;
    28     case DLL_PROCESS_DETACH:
    29         WSACleanup();
    30         break;
    31     }
    32     return TRUE;
    33 }
       1 #include "stdafx.h"
       2 #include "LuaSocket.h"
       3 
       4 #define RWBUFFLEN        (2048)
       5 
       6 #define CON_TIMEO        (3000)
       7 #define APT_TIMEO        (6000)
       8 
       9 #define TIMEO_RCV        (0x01)
      10 #define TIMEO_SND        (0x02)
      11 
      12 #define SELECT_READ      (0x01)
      13 #define SELECT_WRIT      (0x02)
      14 #define SELECT_EXCE      (0x04)
      15 
      16 typedef struct tag_socket
      17 {
      18     SOCKET fd;
      19     int nonb;
      20 } socket_t, *socket_ptr;
      21 
      22 typedef struct tag_selectsets
      23 {
      24     FD_SET readfds;
      25     FD_SET writefds;
      26     FD_SET exceptfds;
      27 } selectsets_t, *selectsets_ptr;
      28 
      29 typedef struct tag_selectfds
      30 {
      31     selectsets_ptr pfds;
      32 } selectfds_t, *selectfds_ptr;
      33 
      34 
      35 int tcp_new( lua_State* lua )
      36 {
      37     SOCKET fd;
      38     socket_ptr psocket;
      39 
      40     if ( ( fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == INVALID_SOCKET )
      41     {
      42         perror( "socket" );
      43         return 0;
      44     }
      45 
      46     psocket = ( socket_ptr )lua_newuserdata( lua, sizeof( socket_t ) );
      47     psocket->fd = fd;
      48     psocket->nonb = 0;
      49 
      50     luaL_getmetatable( lua, "luasocket.metatable" );
      51     lua_setmetatable( lua, -2 );
      52 
      53     return 1;
      54 }
      55 
      56 int socket_equal( lua_State* lua )
      57 {
      58     socket_ptr psocket1, psocket2;
      59 
      60     psocket1 = ( socket_ptr )lua_touserdata( lua, 1 );
      61     psocket2 = ( socket_ptr )lua_touserdata( lua, 2 );
      62 
      63     if ( psocket1->fd == psocket2->fd )
      64     {
      65         lua_pushboolean( lua, 1 );
      66         return 1;
      67     }
      68 
      69     lua_pushboolean( lua, 0 );
      70     return 1;
      71 }
      72 
      73 int table_readonly( lua_State* lua )
      74 {
      75     return 0;
      76 }
      77 
      78 int socket_close_gc( lua_State* lua )
      79 {
      80     socket_ptr psocket;
      81 
      82     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
      83     if ( psocket->fd != INVALID_SOCKET )
      84     {
      85         closesocket( psocket->fd );
      86     }
      87 
      88     return 0;
      89 }
      90 
      91 int socket_close( lua_State* lua )
      92 {
      93     socket_ptr psocket;
      94 
      95     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
      96     if ( psocket->fd != INVALID_SOCKET )
      97     {
      98         closesocket( psocket->fd );
      99         psocket->fd = INVALID_SOCKET;
     100     }
     101 
     102     return 0;
     103 }
     104 
     105 int socket_settimeo( lua_State* lua )
     106 {
     107     socket_ptr psocket;
     108     int msec, type;
     109 
     110     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TNUMBER )
     111     {
     112         goto err_exit;
     113     }
     114 
     115     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     116     msec = ( int )lua_tointeger( lua, 2 );
     117     if ( psocket->fd == INVALID_SOCKET || msec <= 0 )
     118     {
     119         goto err_exit;
     120     }
     121 
     122     type = TIMEO_RCV;
     123     if ( lua_gettop( lua ) > 2 && lua_type( lua, 3 ) == LUA_TNUMBER )
     124     {
     125         type = ( int )lua_tointeger( lua, 3 );
     126     }
     127 
     128     if ( type & TIMEO_RCV )
     129     {
     130         if ( setsockopt( psocket->fd, SOL_SOCKET, SO_RCVTIMEO, ( const char* )&msec, sizeof( int ) ) != 0 )
     131         {
     132             perror( "setsockopt\t<SO_RCVTIMEO>" );
     133             goto err_exit;
     134         }
     135     }
     136 
     137     if ( type & TIMEO_SND )
     138     {
     139         if ( setsockopt( psocket->fd, SOL_SOCKET, SO_SNDTIMEO, ( const char* )&msec, sizeof( int ) ) != 0 )
     140         {
     141             perror( "setsockopt\t<SO_SNDTIMEO>" );
     142             goto err_exit;
     143         }
     144     }
     145 
     146     lua_pushboolean( lua, 1 );
     147     return 1;
     148 err_exit:
     149     lua_pushboolean( lua, 0 );
     150     return 1;
     151 }
     152 
     153 int socket_setnonb( lua_State* lua )
     154 {
     155     socket_ptr psocket;
     156     unsigned long nonb;
     157 
     158     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     159     if ( psocket->fd == INVALID_SOCKET )
     160     {
     161         goto err_exit;
     162     }
     163 
     164     nonb = 1L;
     165     if ( lua_gettop( lua ) > 1 && lua_type( lua, 2 ) == LUA_TBOOLEAN )
     166     {
     167         nonb = ( lua_toboolean( lua, 2 ) == 0 ? 0L : 1L );
     168     }
     169 
     170     if ( psocket->nonb != ( int )nonb )
     171     {
     172         if ( ioctlsocket( psocket->fd, FIONBIO, &nonb ) != 0 )
     173         {
     174             perror( "ioctlsocket\t<FIONBIO>" );
     175             goto err_exit;
     176         }
     177 
     178         psocket->nonb = ( int )nonb;
     179     }
     180 
     181     lua_pushboolean( lua, 1 );
     182     return 1;
     183 err_exit:
     184     lua_pushboolean( lua, 0 );
     185     return 1;
     186 }
     187 
     188 int socket_setlinger( lua_State* lua )
     189 {
     190     socket_ptr psocket;
     191     struct linger lg;
     192 
     193     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TBOOLEAN )
     194     {
     195         goto err_exit;
     196     }
     197 
     198     lg.l_onoff = ( lua_toboolean( lua, 2 ) == 0 ? 0 : 1 );
     199     if ( lg.l_onoff == 1 )
     200     {
     201         if ( lua_gettop( lua ) < 3 || lua_type( lua, 3 ) != LUA_TNUMBER )
     202         {
     203             goto err_exit;
     204         }
     205 
     206         lg.l_linger = ( unsigned short )lua_tointeger( lua, 3 );
     207     }
     208 
     209     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     210     if ( setsockopt( psocket->fd, SOL_SOCKET, SO_LINGER, ( const char* )&lg, sizeof( struct linger ) ) != 0 )
     211     {
     212         perror( "setsockopt\t<SO_LINGER>" );
     213         goto err_exit;
     214     }
     215 
     216     lua_pushboolean( lua, 1 );
     217     return 1;
     218 err_exit:
     219     lua_pushboolean( lua, 0 );
     220     return 1;
     221 }
     222 
     223 int tcp_setnodelay( lua_State* lua )
     224 {
     225     socket_ptr psocket;
     226     int nodelay;
     227 
     228     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     229     if ( psocket->fd == INVALID_SOCKET )
     230     {
     231         goto err_exit;
     232     }
     233 
     234     nodelay = 1;
     235     if ( lua_gettop( lua ) > 1 && lua_type( lua, 2 ) == LUA_TBOOLEAN )
     236     {
     237         nodelay = ( lua_toboolean( lua, 2 ) == 0 ? 0 : 1 );
     238     }
     239 
     240     if ( setsockopt( psocket->fd, IPPROTO_TCP, TCP_NODELAY, ( const char* )&nodelay, sizeof( int ) ) != 0 )
     241     {
     242         perror( "setsockopt\t<TCP_NODELAY>" );
     243         goto err_exit;
     244     }
     245 
     246     lua_pushboolean( lua, 1 );
     247     return 1;
     248 err_exit:
     249     lua_pushboolean( lua, 0 );
     250     return 1;
     251 }
     252 
     253 
     254 int socket_peerip( lua_State* lua )
     255 {
     256     socket_ptr psocket;
     257     int plen;
     258     struct sockaddr ipname;
     259 
     260     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     261     if ( psocket->fd == INVALID_SOCKET )
     262     {
     263         return 0;
     264     }
     265 
     266     plen = sizeof( struct sockaddr );
     267     memset( &ipname, 0, sizeof( struct sockaddr ) );
     268     if ( getpeername( psocket->fd, &ipname, &plen ) !=  0 )
     269     {
     270         perror( "getpeername" );
     271         return 0;
     272     }
     273 
     274     lua_pushfstring( lua, "%d.%d.%d.%d", \
     275                      ( unsigned char )ipname.sa_data[2], \
     276                      ( unsigned char )ipname.sa_data[3], \
     277                      ( unsigned char )ipname.sa_data[4], \
     278                      ( unsigned char )ipname.sa_data[5] );
     279     lua_pushinteger( lua, ( int )ntohs( *( ( unsigned short* )( ipname.sa_data ) ) ) );
     280     return 2;
     281 }
     282 
     283 int socket_localip( lua_State* lua )
     284 {
     285     socket_ptr psocket;
     286     int plen;
     287     struct sockaddr ipname;
     288 
     289     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     290     if ( psocket->fd == INVALID_SOCKET )
     291     {
     292         return 0;
     293     }
     294 
     295     plen = sizeof( struct sockaddr );
     296     memset( &ipname, 0, sizeof( struct sockaddr ) );
     297     if ( getsockname( psocket->fd, &ipname, &plen ) !=  0 )
     298     {
     299         perror( "getsockname" );
     300         return 0;
     301     }
     302 
     303     lua_pushfstring( lua, "%d.%d.%d.%d", \
     304                      ( unsigned char )ipname.sa_data[2], \
     305                      ( unsigned char )ipname.sa_data[3], \
     306                      ( unsigned char )ipname.sa_data[4], \
     307                      ( unsigned char )ipname.sa_data[5] );
     308     lua_pushinteger( lua, ( int )ntohs( *( ( unsigned short* )( ipname.sa_data ) ) ) );
     309     return 2;
     310 }
     311 
     312 int tcp_listen( lua_State* lua )
     313 {
     314     int len;
     315     unsigned short port;
     316     int backlog;
     317     int on;
     318     struct sockaddr_in sin;
     319     socket_ptr psocket;
     320 
     321     len = lua_gettop( lua );
     322     if ( len < 2 )
     323     {
     324         goto err_exit;
     325     }
     326 
     327     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     328     if ( psocket->fd == INVALID_SOCKET )
     329     {
     330         goto err_exit;
     331     }
     332 
     333     if ( len == 2 )
     334     {
     335         if ( lua_type( lua, 2 ) != LUA_TNUMBER )
     336         {
     337             goto err_exit;
     338         }
     339 
     340         port = ( unsigned short )lua_tointeger( lua, 2 );
     341         backlog = 64;
     342     }
     343     else
     344     {
     345         if ( lua_type( lua, 2 ) != LUA_TNUMBER || lua_type( lua, 3 ) != LUA_TNUMBER )
     346         {
     347             goto err_exit;
     348         }
     349 
     350         if ( ( backlog = lua_tointeger( lua, 3 ) ) < 1 )
     351         {
     352             goto err_exit;
     353         }
     354 
     355         port = ( unsigned short )lua_tointeger( lua, 2 );
     356     }
     357 
     358 
     359     on = 1;
     360     if ( setsockopt( psocket->fd, SOL_SOCKET, SO_REUSEADDR, ( const char* )&on, sizeof( int ) ) != 0 )
     361     {
     362         perror( "setsockopt\t<SO_REUSEADDR>" );
     363         goto err_exit;
     364     }
     365 
     366     memset( &sin, 0, sizeof( struct sockaddr_in ) );
     367     sin.sin_family = AF_INET;
     368     sin.sin_addr.s_addr = htonl( INADDR_ANY );
     369     sin.sin_port = htons( port );
     370 
     371     if ( bind( psocket->fd, ( const struct sockaddr* )&sin, sizeof( sin ) ) != 0 )
     372     {
     373         perror( "bind" );
     374         goto err_exit;
     375     }
     376 
     377     if ( listen( psocket->fd, backlog ) != 0 )
     378     {
     379         perror( "listen" );
     380         goto err_exit;
     381     }
     382 
     383     lua_pushboolean( lua, 1 );
     384     return 1;
     385 err_exit:
     386     lua_pushboolean( lua, 0 );
     387     return 1;
     388 }
     389 
     390 int tcp_accept( lua_State* lua )
     391 {
     392     SOCKET fd;
     393     socket_ptr psocket;
     394     struct sockaddr_in sin;
     395     int clilen;
     396     struct timeval tv;
     397     unsigned long nonb;
     398     fd_set fdset;
     399     int msec;
     400     int sign;
     401 
     402     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     403     if ( psocket->fd == INVALID_SOCKET )
     404     {
     405         return 0;
     406     }
     407 
     408     msec = APT_TIMEO;
     409     if ( lua_gettop( lua ) > 1 && lua_type( lua, 2 ) == LUA_TNUMBER )
     410     {
     411         msec = lua_tointeger( lua, 2 );
     412         if ( msec < 3 )
     413         {
     414             msec = APT_TIMEO;
     415         }
     416     }
     417 
     418     sign = 0;
     419     if ( psocket->nonb == 0 )
     420     {
     421         nonb = 1L;
     422         if ( ioctlsocket( psocket->fd, FIONBIO, &nonb ) != 0 )
     423         {
     424             perror( "ioctlsocket\t<FIONBIO>" );
     425             return 0;
     426         }
     427 
     428         psocket->nonb = 1;
     429         sign = 1;
     430     }
     431 
     432     FD_ZERO( &fdset );
     433     FD_SET( psocket->fd, &fdset );
     434 
     435     tv.tv_sec = msec / 1000;
     436     tv.tv_usec = ( msec % 1000 ) * 1000;
     437     if ( select( 0, &fdset, 0, 0, &tv ) != 1 )
     438     {
     439         goto err_exit;
     440     }
     441 
     442     clilen = sizeof( sin );
     443     if ( ( fd = accept( psocket->fd, ( struct sockaddr* ) &sin, &clilen ) ) == INVALID_SOCKET )
     444     {
     445         perror( "accept" );
     446         goto err_exit;
     447     }
     448 
     449     psocket = ( socket_ptr )lua_newuserdata( lua, sizeof( socket_t ) );
     450     psocket->fd = fd;
     451 
     452     luaL_getmetatable( lua, "luasocket.metatable" );
     453     lua_setmetatable( lua, -2 );
     454 
     455     return 1;
     456 err_exit:
     457     if ( sign == 1 )
     458     {
     459         nonb = 0L;
     460         if ( ioctlsocket( psocket->fd, FIONBIO, &nonb ) == 0 )
     461         {
     462             psocket->nonb = 0;
     463         }
     464     }
     465 
     466     return 0;
     467 }
     468 
     469 int tcp_connect( lua_State* lua )
     470 {
     471     const char* host;
     472     unsigned short port;
     473     int msec;
     474     SOCKET fd;
     475     struct hostent* h;
     476     struct sockaddr_in sin;
     477     struct timeval tv;
     478     unsigned long nonb;
     479     fd_set fdset;
     480     socket_ptr psocket;
     481 
     482     if ( lua_gettop( lua ) < 2 )
     483     {
     484         return 0;
     485     }
     486 
     487     if ( lua_type( lua, 1 ) != LUA_TSTRING || ( host = lua_tostring( lua, 1 ) ) == NULL )
     488     {
     489         return 0;
     490     }
     491 
     492     if ( ( h = gethostbyname( host ) ) == NULL || h->h_addrtype != AF_INET )
     493     {
     494         return 0;
     495     }
     496 
     497     memset( &sin, 0, sizeof( sin ) );
     498     sin.sin_family = AF_INET;
     499     memcpy( &sin.sin_addr.s_addr, h->h_addr_list[0], h->h_length );
     500 
     501     if ( lua_type( lua, 2 ) != LUA_TNUMBER || ( port = ( unsigned short )lua_tointeger( lua, 2 ) ) == 0 )
     502     {
     503         return 0;
     504     }
     505 
     506     sin.sin_port = htons( port );
     507 
     508     msec = CON_TIMEO;
     509     if ( lua_gettop( lua ) > 2 && lua_type( lua, 3 ) == LUA_TNUMBER )
     510     {
     511         msec = lua_tointeger( lua, 3 );
     512         if ( msec < 3 )
     513         {
     514             msec = CON_TIMEO;
     515         }
     516     }
     517 
     518     if ( ( fd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) ==  INVALID_SOCKET )
     519     {
     520         perror( "socket" );
     521         return 0;
     522     }
     523 
     524     nonb = 1L;
     525     if ( ioctlsocket( fd, FIONBIO, &nonb ) != 0 )
     526     {
     527         closesocket( fd );
     528         return 0;
     529     }
     530 
     531     if ( connect( fd, ( const struct sockaddr* ) &sin, sizeof( sin ) ) != 0 )
     532     {
     533         FD_ZERO( &fdset );
     534         FD_SET( fd, &fdset );
     535 
     536         tv.tv_sec = msec / 1000;
     537         tv.tv_usec = ( msec % 1000 ) * 1000;
     538         if ( select( 0, 0, &fdset, 0, &tv ) != 1 )
     539         {
     540             closesocket( fd );
     541             return 0;
     542         }
     543     }
     544 
     545     nonb = 0L;
     546     if ( ioctlsocket( fd, FIONBIO, &nonb ) != 0 )
     547     {
     548         closesocket( fd );
     549         return 0;
     550     }
     551 
     552     psocket = ( socket_ptr )lua_newuserdata( lua, sizeof( socket_t ) );
     553     psocket->fd = fd;
     554     psocket->nonb = 0;
     555 
     556     luaL_getmetatable( lua, "luasocket.metatable" );
     557     lua_setmetatable( lua, -2 );
     558 
     559     return 1;
     560 }
     561 
     562 
     563 int tcp_read( lua_State* lua )
     564 {
     565     socket_ptr psocket;
     566     luaL_Buffer b;
     567     unsigned char chunk[RWBUFFLEN];
     568     int nread;
     569     char* ptr;
     570 
     571     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     572     if ( psocket->fd == INVALID_SOCKET )
     573     {
     574         return 0;
     575     }
     576 
     577     ptr = ( char* )chunk;
     578     luaL_buffinit( lua, &b );
     579     while ( 1 )
     580     {
     581         nread = recv( psocket->fd, ptr, ( int )RWBUFFLEN, 0 );
     582         if ( nread < 0 )
     583         {
     584             if ( WSAGetLastError() == WSAEINTR )
     585             {
     586                 continue;
     587             }
     588             else if ( WSAGetLastError() == WSAEWOULDBLOCK )
     589             {
     590                 break;
     591             }
     592             else
     593             {
     594                 /*luaL_pushresult( &b );
     595                 lua_settop( lua, -2 );
     596                 return 0;*/
     597                 break;
     598             }
     599         }
     600         else if ( nread == 0 )
     601         {
     602             break;
     603         }
     604 
     605         luaL_addlstring( &b, ptr, nread );
     606     }
     607 
     608     luaL_pushresult( &b );
     609     return 1;
     610 }
     611 
     612 int tcp_readn( lua_State* lua )
     613 {
     614     socket_ptr psocket;
     615     luaL_Buffer b;
     616     unsigned char chunk[RWBUFFLEN];
     617     int nleft, nread;
     618     char* ptr;
     619 
     620     if ( lua_gettop( lua ) < 2  || lua_type( lua, 2 ) != LUA_TNUMBER )
     621     {
     622         return 0;
     623     }
     624 
     625     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     626     if ( psocket->fd == INVALID_SOCKET )
     627     {
     628         return 0;
     629     }
     630 
     631     nleft = ( int )lua_tointeger( lua, 2 );
     632 
     633     ptr = ( char* )chunk;
     634     luaL_buffinit( lua, &b );
     635     while ( nleft > 0 )
     636     {
     637         if ( nleft >= RWBUFFLEN )
     638         {
     639             nread = recv( psocket->fd, ptr, ( int )RWBUFFLEN, 0 );
     640         }
     641         else
     642         {
     643             nread = recv( psocket->fd, ptr, nleft, 0 );
     644         }
     645 
     646         if ( nread < 0 )
     647         {
     648             if ( WSAGetLastError() == WSAEINTR )
     649             {
     650                 continue;
     651             }
     652             else if ( WSAGetLastError() == WSAEWOULDBLOCK )
     653             {
     654                 continue;
     655             }
     656             else
     657             {
     658                 luaL_pushresult( &b );
     659                 lua_settop( lua, -2 );
     660                 return 0;
     661             }
     662         }
     663         else if ( nread == 0 )
     664         {
     665             break;
     666         }
     667 
     668         luaL_addlstring( &b, ptr, nread );
     669         nleft -= nread;
     670     }
     671 
     672     luaL_pushresult( &b );
     673     return 1;
     674 }
     675 
     676 int tcp_write( lua_State* lua )
     677 {
     678     socket_ptr psocket;
     679     size_t nleft;
     680     const char* ptr;
     681     int nwritten, nwrittens;
     682 
     683     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TSTRING )
     684     {
     685         return 0;
     686     }
     687 
     688     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     689     if ( psocket->fd == INVALID_SOCKET )
     690     {
     691         return 0;
     692     }
     693 
     694     ptr = lua_tolstring( lua, 2, &nleft );
     695     if ( ptr == NULL )
     696     {
     697         return 0;
     698     }
     699 
     700     nwrittens = 0;
     701     while ( ( int )nleft > 0 )
     702     {
     703         nwritten = send( psocket->fd, ptr, ( int )nleft, 0 );
     704         if ( nwritten < 0 )
     705         {
     706             if ( WSAGetLastError() == WSAEINTR )
     707             {
     708                 continue;
     709             }
     710             else if ( WSAGetLastError() == WSAEWOULDBLOCK )
     711             {
     712                 break;
     713             }
     714 
     715             return 0;
     716         }
     717         else if ( nwritten == 0 )
     718         {
     719             break;
     720         }
     721 
     722         nleft -= nwritten;
     723         ptr += nwritten;
     724         nwrittens += nwritten;
     725     }
     726 
     727     lua_pushinteger( lua, nwrittens );
     728     return 1;
     729 }
     730 
     731 int tcp_writen( lua_State* lua )
     732 {
     733     socket_ptr psocket;
     734     size_t nleft;
     735     const char* ptr;
     736     int nwritten, nwrittens;
     737 
     738     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TSTRING )
     739     {
     740         return 0;
     741     }
     742 
     743     psocket = ( socket_ptr )lua_touserdata( lua, 1 );
     744     if ( psocket->fd == INVALID_SOCKET )
     745     {
     746         return 0;
     747     }
     748 
     749     ptr = lua_tolstring( lua, 2, &nleft );
     750     if ( ptr == NULL )
     751     {
     752         return 0;
     753     }
     754 
     755     nwrittens = 0;
     756     while ( ( int )nleft > 0 )
     757     {
     758         nwritten = send( psocket->fd, ptr, ( int )nleft, 0 );
     759         if ( nwritten < 0 )
     760         {
     761             if ( WSAGetLastError() == WSAEINTR )
     762             {
     763                 continue;
     764             }
     765             else if ( WSAGetLastError() == WSAEWOULDBLOCK )
     766             {
     767                 continue;
     768             }
     769 
     770             return 0;
     771         }
     772         else if ( nwritten == 0 )
     773         {
     774             break;
     775         }
     776 
     777         nleft -= nwritten;
     778         ptr += nwritten;
     779         nwrittens += nwritten;
     780     }
     781 
     782     lua_pushinteger( lua, nwrittens );
     783     return 1;
     784 }
     785 
     786 int select_new( lua_State* lua )
     787 {
     788     selectfds_ptr psel;
     789 
     790     psel = ( selectfds_ptr )lua_newuserdata( lua, sizeof( selectfds_t ) );
     791 
     792     psel->pfds = ( selectsets_ptr )malloc( sizeof( selectsets_t ) );
     793     if ( psel->pfds == NULL )
     794     {
     795         return 0;
     796     }
     797 
     798     FD_ZERO( &psel->pfds->readfds );
     799     FD_ZERO( &psel->pfds->writefds );
     800     FD_ZERO( &psel->pfds->exceptfds );
     801 
     802     luaL_getmetatable( lua, "luasocket.select.metatable" );
     803     lua_setmetatable( lua, -2 );
     804 
     805     return 1;
     806 }
     807 
     808 int select_destroy( lua_State* lua )
     809 {
     810     selectfds_ptr psel;
     811 
     812     psel = ( selectfds_ptr )lua_touserdata( lua, 1 );
     813     if ( psel->pfds != NULL )
     814     {
     815         free( psel->pfds );
     816     }
     817 
     818     return 0;
     819 }
     820 
     821 int select_clear( lua_State* lua )
     822 {
     823     selectfds_ptr psel;
     824     int type;
     825 
     826     psel = ( selectfds_ptr )lua_touserdata( lua, 1 );
     827 
     828     type = SELECT_READ | SELECT_WRIT | SELECT_EXCE;
     829     if ( lua_gettop( lua ) > 1 && lua_type( lua, 2 ) == LUA_TNUMBER )
     830     {
     831         type = ( int )lua_tointeger( lua, 2 );
     832     }
     833 
     834     if ( type & SELECT_READ )
     835     {
     836         FD_ZERO( &psel->pfds->readfds );
     837     }
     838 
     839     if ( type & SELECT_WRIT )
     840     {
     841         FD_ZERO( &psel->pfds->writefds );
     842     }
     843 
     844     if ( type & SELECT_EXCE )
     845     {
     846         FD_ZERO( &psel->pfds->exceptfds );
     847     }
     848 
     849     lua_pushboolean( lua, 1 );
     850     return 1;
     851 }
     852 
     853 int select_addfd( lua_State* lua )
     854 {
     855     socket_ptr psocket;
     856     selectfds_ptr psel;
     857     int type;
     858 
     859     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TUSERDATA )
     860     {
     861         lua_pushboolean( lua, 0 );
     862         return 1;
     863     }
     864 
     865     psel = ( selectfds_ptr )lua_touserdata( lua, 1 );
     866     psocket = ( socket_ptr )lua_touserdata( lua, 2 );
     867 
     868     type = SELECT_READ | SELECT_WRIT | SELECT_EXCE;
     869     if ( lua_gettop( lua ) > 2 && lua_type( lua, 3 ) == LUA_TNUMBER )
     870     {
     871         type = ( int )lua_tointeger( lua, 3 );
     872     }
     873 
     874     if ( type & SELECT_READ )
     875     {
     876         FD_SET( psocket->fd, &psel->pfds->readfds );
     877     }
     878 
     879     if ( type & SELECT_WRIT )
     880     {
     881         FD_SET( psocket->fd, &psel->pfds->writefds );
     882     }
     883 
     884     if ( type & SELECT_EXCE )
     885     {
     886         FD_SET( psocket->fd, &psel->pfds->exceptfds );
     887     }
     888 
     889     lua_pushboolean( lua, 1 );
     890     return 1;
     891 }
     892 
     893 int select_delfd( lua_State* lua )
     894 {
     895     socket_ptr psocket;
     896     selectfds_ptr psel;
     897     int type;
     898 
     899     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TUSERDATA )
     900     {
     901         lua_pushboolean( lua, 0 );
     902         return 1;
     903     }
     904 
     905     psel = ( selectfds_ptr )lua_touserdata( lua, 1 );
     906     psocket = ( socket_ptr )lua_touserdata( lua, 2 );
     907 
     908     type = SELECT_READ | SELECT_WRIT | SELECT_EXCE;
     909     if ( lua_gettop( lua ) > 2 && lua_type( lua, 3 ) == LUA_TNUMBER )
     910     {
     911         type = ( int )lua_tointeger( lua, 3 );
     912     }
     913 
     914     if ( type & SELECT_READ )
     915     {
     916         FD_CLR( psocket->fd, &psel->pfds->readfds );
     917     }
     918 
     919     if ( type & SELECT_WRIT )
     920     {
     921         FD_CLR( psocket->fd, &psel->pfds->writefds );
     922     }
     923 
     924     if ( type & SELECT_EXCE )
     925     {
     926         FD_CLR( psocket->fd, &psel->pfds->exceptfds );
     927     }
     928 
     929     lua_pushboolean( lua, 1 );
     930     return 1;
     931 }
     932 
     933 int select_isset( lua_State* lua )
     934 {
     935     selectfds_ptr psel;
     936     socket_ptr psocket;
     937     int type;
     938 
     939     if ( lua_gettop( lua ) < 2 || lua_type( lua, 2 ) != LUA_TUSERDATA )
     940     {
     941         lua_pushboolean( lua, 0 );
     942         return 1;
     943     }
     944 
     945     psel = ( selectfds_ptr )lua_touserdata( lua, 1 );
     946     psocket = ( socket_ptr )lua_touserdata( lua, 2 );
     947 
     948     type = SELECT_READ;
     949     if ( lua_gettop( lua ) > 2 && lua_type( lua, 3 ) == LUA_TNUMBER )
     950     {
     951         type = ( int )lua_tointeger( lua, 3 );
     952     }
     953 
     954     if ( type & SELECT_READ )
     955     {
     956         if ( FD_ISSET( psocket->fd, &psel->pfds->readfds ) )
     957         {
     958             lua_pushboolean( lua, 1 );
     959             return 1;
     960         }
     961     }
     962     else if ( type & SELECT_WRIT )
     963     {
     964         if ( FD_ISSET( psocket->fd, &psel->pfds->writefds ) )
     965         {
     966             lua_pushboolean( lua, 1 );
     967             return 1;
     968         }
     969     }
     970     else if ( type & SELECT_EXCE )
     971     {
     972         if ( FD_ISSET( psocket->fd, &psel->pfds->exceptfds ) )
     973         {
     974             lua_pushboolean( lua, 1 );
     975             return 1;
     976         }
     977     }
     978 
     979     lua_pushboolean( lua, 0 );
     980     return 1;
     981 }
     982 
     983 int select_select( lua_State* lua )
     984 {
     985     selectfds_ptr psel;
     986     struct timeval tv;
     987     int msec;
     988     int ret;
     989 
     990     psel = ( selectfds_ptr )lua_touserdata( lua, 1 );
     991 
     992     msec = 0;
     993     if ( lua_gettop( lua ) > 1 && lua_type( lua, 2 ) == LUA_TNUMBER )
     994     {
     995         msec = ( int )lua_tointeger( lua, 2 );
     996     }
     997 
     998     if ( msec > 0 )
     999     {
    1000         tv.tv_sec = msec / 1000;
    1001         tv.tv_usec = ( msec % 1000 ) * 1000;
    1002         ret = select( 0, &psel->pfds->readfds, &psel->pfds->writefds, &psel->pfds->exceptfds, &tv );
    1003     }
    1004     else
    1005     {
    1006         ret = select( 0, &psel->pfds->readfds, &psel->pfds->writefds, &psel->pfds->exceptfds, NULL );
    1007     }
    1008 
    1009     lua_pushinteger( lua, ret );
    1010     return 1;
    1011 }
    1012 
    1013 static luaL_Reg _mylibs[] =
    1014 {
    1015     {"tcp", tcp_new},
    1016     {"connect", tcp_connect},
    1017     {"newsel", select_new},
    1018     {NULL, NULL}
    1019 };
    1020 
    1021 int luaopen_LuaSocket( lua_State* lua )
    1022 {
    1023     /****************************************************/
    1024     luaL_newmetatable( lua, "luasocket.metatable" );
    1025 
    1026     lua_pushstring( lua, "__index" );
    1027     lua_pushvalue( lua, -2 );
    1028     lua_rawset( lua, -3 );
    1029 
    1030     lua_pushstring( lua, "__newindex" );
    1031     lua_pushcfunction( lua, table_readonly );
    1032     lua_rawset( lua, -3 );
    1033 
    1034     lua_pushstring( lua, "__gc" );
    1035     lua_pushcfunction( lua, socket_close_gc );
    1036     lua_rawset( lua, -3 );
    1037 
    1038     lua_pushstring( lua, "__eq" );
    1039     lua_pushcfunction( lua, socket_equal );
    1040     lua_rawset( lua, -3 );
    1041 
    1042     lua_pushstring( lua, "close" );
    1043     lua_pushcfunction( lua, socket_close );
    1044     lua_rawset( lua, -3 );
    1045 
    1046     lua_pushstring( lua, "timeout" );
    1047     lua_pushcfunction( lua, socket_settimeo );
    1048     lua_rawset( lua, -3 );
    1049 
    1050     lua_pushstring( lua, "nonb" );
    1051     lua_pushcfunction( lua, socket_setnonb );
    1052     lua_rawset( lua, -3 );
    1053 
    1054     lua_pushstring( lua, "linger" );
    1055     lua_pushcfunction( lua, socket_setlinger );
    1056     lua_rawset( lua, -3 );
    1057 
    1058     lua_pushstring( lua, "nodelay" );
    1059     lua_pushcfunction( lua, tcp_setnodelay );
    1060     lua_rawset( lua, -3 );
    1061 
    1062     lua_pushstring( lua, "peerip" );
    1063     lua_pushcfunction( lua, socket_peerip );
    1064     lua_rawset( lua, -3 );
    1065 
    1066     lua_pushstring( lua, "localip" );
    1067     lua_pushcfunction( lua, socket_localip );
    1068     lua_rawset( lua, -3 );
    1069 
    1070     lua_pushstring( lua, "listen" );
    1071     lua_pushcfunction( lua, tcp_listen );
    1072     lua_rawset( lua, -3 );
    1073 
    1074     lua_pushstring( lua, "accept" );
    1075     lua_pushcfunction( lua, tcp_accept );
    1076     lua_rawset( lua, -3 );
    1077 
    1078     lua_pushstring( lua, "readn" );
    1079     lua_pushcfunction( lua, tcp_readn );
    1080     lua_rawset( lua, -3 );
    1081 
    1082     lua_pushstring( lua, "writen" );
    1083     lua_pushcfunction( lua, tcp_writen );
    1084     lua_rawset( lua, -3 );
    1085 
    1086     lua_pushstring( lua, "read" );
    1087     lua_pushcfunction( lua, tcp_read );
    1088     lua_rawset( lua, -3 );
    1089 
    1090     lua_pushstring( lua, "write" );
    1091     lua_pushcfunction( lua, tcp_write );
    1092     lua_rawset( lua, -3 );
    1093 
    1094     lua_pushstring( lua, "MSK_TIMEO_RCV" );
    1095     lua_pushinteger( lua, TIMEO_RCV );
    1096     lua_rawset( lua, -3 );
    1097 
    1098     lua_pushstring( lua, "MSK_TIMEO_SND" );
    1099     lua_pushinteger( lua, TIMEO_SND );
    1100     lua_rawset( lua, -3 );
    1101 
    1102     /****************************************************/
    1103     luaL_newmetatable( lua, "luasocket.select.metatable" );
    1104 
    1105     lua_pushstring( lua, "__index" );
    1106     lua_pushvalue( lua, -2 );
    1107     lua_rawset( lua, -3 );
    1108 
    1109     lua_pushstring( lua, "__newindex" );
    1110     lua_pushcfunction( lua, table_readonly );
    1111     lua_rawset( lua, -3 );
    1112 
    1113     lua_pushstring( lua, "__gc" );
    1114     lua_pushcfunction( lua, select_destroy );
    1115     lua_rawset( lua, -3 );
    1116 
    1117     lua_pushstring( lua, "clear" );
    1118     lua_pushcfunction( lua, select_clear );
    1119     lua_rawset( lua, -3 );
    1120 
    1121     lua_pushstring( lua, "add" );
    1122     lua_pushcfunction( lua, select_addfd );
    1123     lua_rawset( lua, -3 );
    1124 
    1125     lua_pushstring( lua, "del" );
    1126     lua_pushcfunction( lua, select_delfd );
    1127     lua_rawset( lua, -3 );
    1128 
    1129     lua_pushstring( lua, "isset" );
    1130     lua_pushcfunction( lua, select_isset );
    1131     lua_rawset( lua, -3 );
    1132 
    1133     lua_pushstring( lua, "select" );
    1134     lua_pushcfunction( lua, select_select );
    1135     lua_rawset( lua, -3 );
    1136 
    1137     lua_pushstring( lua, "MSK_SEL_READ" );
    1138     lua_pushinteger( lua, SELECT_READ );
    1139     lua_rawset( lua, -3 );
    1140 
    1141     lua_pushstring( lua, "MSK_SEL_WRIT" );
    1142     lua_pushinteger( lua, SELECT_WRIT );
    1143     lua_rawset( lua, -3 );
    1144 
    1145     lua_pushstring( lua, "MSK_SEL_EXCE" );
    1146     lua_pushinteger( lua, SELECT_EXCE );
    1147     lua_rawset( lua, -3 );
    1148 
    1149     /****************************************************/
    1150 
    1151     luaL_newlib( lua, _mylibs );
    1152     return 1;
    1153 }
  • 相关阅读:
    关于线程池的线程复用
    Java线程锁之意难平的读写锁
    Java8之StringJoiner
    springboot整合thymeleaf
    一维数组转二叉树、注解回滚、eclipse配置代码自动补全
    Java之线程锁
    关于工作中的一些总结
    关于shiro的猜测
    Java之扫描不到mapper
    网页中引用css样式
  • 原文地址:https://www.cnblogs.com/javado/p/2834792.html
Copyright © 2011-2022 走看看