在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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< |
请发表评论