--- ansh/src/client3.c 2011/10/07 13:41:26 1.1.1.1.2.2 +++ ansh/src/client3.c 2011/10/13 14:29:30 1.1.1.1.2.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: client3.c,v 1.1.1.1.2.2 2011/10/07 13:41:26 misho Exp $ + * $Id: client3.c,v 1.1.1.1.2.3 2011/10/13 14:29:30 misho Exp $ * *************************************************************************/ #include "global.h" @@ -27,7 +27,7 @@ SetRemoteWinz(int h, u_short id, struct sockaddr *sa, pos[1] = htons(ws.ws_col); pos[2] = htons(ws.ws_xpixel); pos[3] = htons(ws.ws_ypixel); - if (icmpSend(h, id, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, sa, sizeof(struct sockaddr)) == -1) + if (icmpSend(h, 0, id, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, sa, sizeof(struct sockaddr)) == -1) return -1; return 0; @@ -45,6 +45,7 @@ ConnectL3(int h, u_short id, struct sockaddr *sa, int char flg, nl = 0; u_char *buf, *str; socklen_t sl; + u_int sq, Seq = 0; FTRACE(3); @@ -68,7 +69,47 @@ ConnectL3(int h, u_short id, struct sockaddr *sa, int ret = -1; break; } - if (FD_ISSET(STDIN_FILENO, &rfd)) { + if (FD_ISSET(h, &rfd)) { + sl = sizeof s; + rlen = len; + memset(buf, 0, rlen); + flg = icmpRecv(h, &sq, &aid, &Crypted, buf, &rlen, &s, &sl); + if (flg == ANSH_FLG_ERR) { + ret = -1; + break; + } + if (aid != id) { + VERB(4) LOG("different service id %d / %d\n", aid, id); + continue; + } + if (flg == ANSH_FLG_EOF) { + VERB(3) LOG("receive EOF going down.\n"); + Kill++; + } + if (flg != ANSH_FLG_OK) + continue; + if (sq <= Seq) + continue; + else if (sq > (Seq + 1)) + VERB(1) LOG("LOST PACKET(s) detect: %d; received seq=%d - %d", + sq - Seq + 1, sq, Seq); + Seq = sq; + + if (Crypted) { + str = cryptBuffer(buf, rlen, Crypted); + if (str) { + memcpy(buf, str, rlen); + free(str); + } + } + + rlen = write(STDOUT_FILENO, buf, rlen); + if (rlen == -1) { + printf("Error:: write(stdout) #%d - %s\n", errno, strerror(errno)); + ret = -1; + break; + } + } else { memset(buf, 0, len); rlen = read(STDIN_FILENO, buf, len); if (rlen == -1) { @@ -115,42 +156,8 @@ ConnectL3(int h, u_short id, struct sockaddr *sa, int } } - rlen = icmpSend(h, id, ANSH_FLG_CPOUT, Crypted, buf, rlen, sa, sizeof(struct sockaddr)); + rlen = icmpSend(h, ++Seq, id, ANSH_FLG_CPOUT, Crypted, buf, rlen, sa, sizeof(struct sockaddr)); if (rlen == ANSH_FLG_ERR) { - ret = -1; - break; - } - } else { - sl = sizeof s; - rlen = len; - memset(buf, 0, rlen); - flg = icmpRecv(h, &aid, &Crypted, buf, &rlen, &s, &sl); - if (flg == ANSH_FLG_ERR) { - ret = -1; - break; - } - if (aid != id) { - VERB(4) LOG("different service id %d / %d\n", aid, id); - continue; - } - if (flg == ANSH_FLG_EOF) { - VERB(3) LOG("receive EOF going down.\n"); - Kill++; - } - if (flg != ANSH_FLG_OK) - continue; - - if (Crypted) { - str = cryptBuffer(buf, rlen, Crypted); - if (str) { - memcpy(buf, str, rlen); - free(str); - } - } - - rlen = write(STDOUT_FILENO, buf, rlen); - if (rlen == -1) { - printf("Error:: write(stdout) #%d - %s\n", errno, strerror(errno)); ret = -1; break; }