Mercurial > hg > nnchat
diff libnnchat.c @ 360:b465a17ffa47
Finally fix handling of long packets.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 23 Jun 2011 10:37:11 +0300 |
parents | 8f3c102db611 |
children | 88ac689d11bc |
line wrap: on
line diff
--- a/libnnchat.c Thu Jun 23 10:11:45 2011 +0300 +++ b/libnnchat.c Thu Jun 23 10:37:11 2011 +0300 @@ -183,7 +183,7 @@ FD_ZERO(&(conn->sockfds)); FD_SET(conn->socket, &(conn->sockfds)); - + /* Proxy-specific setup */ if (conn->proxy.type == NN_PROXY_SOCKS4 || conn->proxy.type == NN_PROXY_SOCKS4A) { struct nn_socks_t *socksh; @@ -221,6 +221,7 @@ } /* Send request */ + nn_conn_reset(conn); if (!nn_conn_send_buf(conn, buf, bufsiz)) { th_free(buf); nn_conn_err(conn, "Error sending SOCKS proxy request.\n"); @@ -231,6 +232,7 @@ /* Wait for SOCKS server to reply */ for (status = tries = 1; tries <= 20 && status > 0; tries++) { usleep(500); + nn_conn_reset(conn); status = nn_conn_pull(conn); } @@ -264,6 +266,7 @@ } } + nn_conn_reset(conn); conn->status = NN_CONN_OPEN; return 0; @@ -316,6 +319,13 @@ return TRUE; } +void nn_conn_reset(nn_conn_t *conn) +{ + if (conn != NULL) { + conn->ptr = conn->buf; + conn->got = conn->total = 0; + } +} int nn_conn_pull(nn_conn_t *conn) { @@ -326,8 +336,6 @@ if (conn == NULL) return -10; - conn->ptr = conn->buf; - /* Check for incoming data */ socktv.tv_sec = 0; socktv.tv_usec = NN_DELAY_USEC; @@ -342,7 +350,7 @@ } } else if (FD_ISSET(conn->socket, &tmpfds)) { - conn->got = recv(conn->socket, conn->buf, NN_CONNBUF_SIZE, 0); + conn->got = recv(conn->socket, conn->ptr, NN_CONNBUF_SIZE - conn->total, 0); if (conn->got < 0) { conn->err = nn_get_socket_errno(); nn_conn_err(conn, "Error in recv: %d, %s\n", conn->err, nn_get_socket_errstr(conn->err)); @@ -353,7 +361,8 @@ return -3; } else { /* Handle protocol data */ - conn->buf[conn->got] = 0; + conn->total += conn->got; + conn->ptr += conn->got; return 0; } }