Seems to be working on windows.

This commit is contained in:
Diego Nehab 2005-03-11 02:21:27 +00:00
parent e57f9e9964
commit 6dc9c1096a
5 changed files with 12 additions and 10 deletions

View File

@ -57,7 +57,7 @@ function init()
assert(iport, "invalid arguments") assert(iport, "invalid arguments")
-- create our server socket -- create our server socket
local server = assert(socket.bind("*", iport)) local server = assert(socket.bind("*", iport))
server:settimeout(0.1) -- we don't want to be killed by bad luck server:settimeout(0) -- we don't want to be killed by bad luck
-- make sure server is tested for readability -- make sure server is tested for readability
receiving:insert(server) receiving:insert(server)
-- add server context -- add server context
@ -71,7 +71,7 @@ end
-- starts a connection in a non-blocking way -- starts a connection in a non-blocking way
function connect(who, host, port) function connect(who, host, port)
who:settimeout(0.1) who:settimeout(0)
print("trying to connect peer", who, host, port) print("trying to connect peer", who, host, port)
local ret, err = who:connect(host, port) local ret, err = who:connect(host, port)
if not ret and err == "timeout" then if not ret and err == "timeout" then
@ -89,12 +89,11 @@ print("connection failed", who)
end end
end end
-- gets rid of a client and its peer -- gets rid of a client
function kick(who) function kick(who)
if who and context[who] then if who and context[who] then
sending:remove(who) sending:remove(who)
receiving:remove(who) receiving:remove(who)
local peer = context[who].peer
context[who] = nil context[who] = nil
who:close() who:close()
end end

View File

@ -77,7 +77,7 @@ int buf_meth_send(lua_State *L, p_buf buf) {
int top = lua_gettop(L); int top = lua_gettop(L);
p_tm tm = tm_markstart(buf->tm); p_tm tm = tm_markstart(buf->tm);
int err = IO_DONE; int err = IO_DONE;
size_t size, sent; size_t size = 0, sent = 0;
const char *data = luaL_checklstring(L, 2, &size); const char *data = luaL_checklstring(L, 2, &size);
long start = (long) luaL_optnumber(L, 3, 1); long start = (long) luaL_optnumber(L, 3, 1);
long end = (long) luaL_optnumber(L, 4, -1); long end = (long) luaL_optnumber(L, 4, -1);

View File

@ -228,10 +228,12 @@ static int meth_connect(lua_State *L)
static int meth_connected(lua_State *L) static int meth_connected(lua_State *L)
{ {
p_tcp tcp; p_tcp tcp = (p_tcp) aux_checkclass(L, "tcp{master}", 1);
int err; int err;
tcp = (p_tcp) aux_checkclass(L, "tcp{master}", 1); t_tm tm;
err = sock_connected(&tcp->sock, &tcp->tm); tm_init(&tm, 0.1, -1);
tm_markstart(&tm);
err = sock_connected(&tcp->sock, &tm);
if (err != IO_DONE) { if (err != IO_DONE) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, sock_strerror(err)); lua_pushstring(L, sock_strerror(err));

View File

@ -10,8 +10,8 @@
/* timeout control structure */ /* timeout control structure */
typedef struct t_tm_ { typedef struct t_tm_ {
double total; /* total number of miliseconds for operation */
double block; /* maximum time for blocking calls */ double block; /* maximum time for blocking calls */
double total; /* total number of miliseconds for operation */
double start; /* time of start of operation */ double start; /* time of start of operation */
} t_tm; } t_tm;
typedef t_tm *p_tm; typedef t_tm *p_tm;

View File

@ -129,10 +129,11 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
int sock_connected(p_sock ps, p_tm tm) { int sock_connected(p_sock ps, p_tm tm) {
int err; int err;
/* give windows time to find out what is up (yes, disgusting) */
if ((err = sock_waitfd(ps, WAITFD_C, tm)) == IO_CLOSED) { if ((err = sock_waitfd(ps, WAITFD_C, tm)) == IO_CLOSED) {
int len = sizeof(err); int len = sizeof(err);
/* give windows time to set the error (yes, disgusting) */ /* give windows time to set the error (yes, disgusting) */
Sleep(0); Sleep(10);
/* find out why we failed */ /* find out why we failed */
getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len);
/* we KNOW there was an error. if 'why' is 0, we will return /* we KNOW there was an error. if 'why' is 0, we will return