--- ansh/src/client2.c 2011/10/10 13:56:30 1.1.1.1.2.2 +++ ansh/src/client2.c 2011/10/13 14:29:30 1.1.1.1.2.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: client2.c,v 1.1.1.1.2.2 2011/10/10 13:56:30 misho Exp $ + * $Id: client2.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, struct ether_addr *ea, u_char *bu pos[1] = htons(ws.ws_col); pos[2] = htons(ws.ws_xpixel); pos[3] = htons(ws.ws_ypixel); - if (pktSend(h, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1) + if (pktSend(h, 0, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1) return -1; return 0; @@ -43,6 +43,7 @@ ConnectL2(int h, struct ether_addr *ea, int len) int rlen, ret = 0; char flg, nl = 0; u_char *buf, *str; + u_int s, Seq = 0; FTRACE(3); @@ -66,7 +67,46 @@ ConnectL2(int h, struct ether_addr *ea, int len) ret = -1; break; } - if (FD_ISSET(STDIN_FILENO, &rfd)) { + if (FD_ISSET(h, &rfd)) { + rlen = len; + memset(buf, 0, rlen); + flg = pktRecv(h, &s, &Crypted, buf, &rlen, ð); + if (flg == ANSH_FLG_ERR) { + ret = -1; + break; + } + if (ntohs(eth.ether_type) != ANSH_ID) { + VERB(4) LOG("different service id %d / %d\n", eth.ether_type, ANSH_ID); + continue; + } + if (flg == ANSH_FLG_EOF) { + VERB(3) LOG("receive EOF going down.\n"); + Kill++; + } + if (flg != ANSH_FLG_OK) + continue; + if (s <= Seq) + continue; + else if (s > (Seq + 1)) + VERB(1) LOG("LOST PACKET(s) detect: %d; received seq=%d - %d", + s - (Seq + 1), s, Seq); + Seq = s; + + 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) { @@ -113,41 +153,8 @@ ConnectL2(int h, struct ether_addr *ea, int len) } } - rlen = pktSend(h, ANSH_FLG_CPOUT, Crypted, buf, rlen, ea); + rlen = pktSend(h, ++Seq, ANSH_FLG_CPOUT, Crypted, buf, rlen, ea); if (rlen == ANSH_FLG_ERR) { - ret = -1; - break; - } - } else { - rlen = len; - memset(buf, 0, rlen); - flg = pktRecv(h, &Crypted, buf, &rlen, ð); - if (flg == ANSH_FLG_ERR) { - ret = -1; - break; - } - if (ntohs(eth.ether_type) != ANSH_ID) { - VERB(4) LOG("different service id %d / %d\n", eth.ether_type, ANSH_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; }