// // Copyright (c) 2013 _iTo_ // #include #include "iTerm.h" void iTermNegoStart(pSocketParam sprm) { int i = 0; sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfb; sprm->sendData[i++]=0x18; // IAC WILL terminal_type sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfd; sprm->sendData[i++]=0x03; // IAC DO suppress_go_ahead sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfb; sprm->sendData[i++]=0x03; // IAC WILL suppress_go_ahead sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfd; sprm->sendData[i++]=0x01; // IAC DO echo sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfb; sprm->sendData[i++]=0x1f; // IAC WILL window_size sprm->sendDataSize = i; iTermSend(sprm,true); // SendMessage(sprm->hWnd , WM_NEGO , 0 , 0); } void iTermNegoWindSize(pSocketParam sprm) { // 画面サイズとターミナルタイプの設定 int i = 0; sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfa; sprm->sendData[i++]=0x1f; // Sub-negotiation Begin & Window Size sprm->sendData[i++]=0x00; sprm->sendData[i++]=MAXCOLUMN; // 横のカラム数 sprm->sendData[i++]=0x00; sprm->sendData[i++]=MAXLINE; // 縦の行数 sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xf0; // Sub-negotiation End sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xfa; sprm->sendData[i++]=0x18; // Sub-negotiation Begin & Terminal Type sprm->sendData[i++]=0x00; sprm->sendData[i++]=0x76; sprm->sendData[i++]=0x74; // 'vt' sprm->sendData[i++]=0x31; sprm->sendData[i++]=0x30; sprm->sendData[i++]=0x30; // '100' sprm->sendData[i++]=0xff; sprm->sendData[i++]=0xf0; // Sub-negotiation End sprm->sendDataSize = i; } boolean iTermNegotiation(boolean nego, pSocketParam sprm, DWORD *loop) { int i; for(i=0; i < sprm->recvDataSize ;i++,sprm->sendDataSize=i){ if((i+1)recvDataSize && (sprm->recvData[i]==NEGO_IAC && sprm->recvData[i+1]==250)){ // Sub-negotiation Begin for(i++; i < sprm->recvDataSize ;i++){ if((i+1)recvDataSize && (sprm->recvData[i]==NEGO_IAC && sprm->recvData[i+1]==240)){ // Sub-negotiation End iTermNegoWindSize(sprm); // 画面設定 return nego; } } }else if((i+2)recvDataSize && (sprm->recvData[i]==NEGO_IAC && sprm->recvData[i+1]==251)){ // WILL if(sprm->recvData[i+2]==1 || sprm->recvData[i+2]==3){ // Echo or Go Ahead 抑止 sprm->sendData[i] = NEGO_IAC; i++; sprm->sendData[i] = 253; i++; // DO sprm->sendData[i] = sprm->recvData[i]; }else{ sprm->sendData[i] = NEGO_IAC; i++; sprm->sendData[i] = 254; i++; // DON'T sprm->sendData[i] = sprm->recvData[i]; } *loop = i+1; }else if((i+2)recvDataSize && sprm->recvData[i]==NEGO_IAC){ // 上記以外のTelnetコマンドは、WON'Tとする sprm->sendData[i] = NEGO_IAC; i++; sprm->sendData[i] = 252; i++; // WON'T sprm->sendData[i] = sprm->recvData[i]; *loop = i+1; }else{ nego = false; // loginが来たと判断 } } return nego; }