有誰可以把這個win32程序轉成linux的程序 |
|
vlad dracula
一般會員 發表:13 回覆:9 積分:4 註冊:2006-07-09 發送簡訊給我 |
int main()
{ WSADATA wsa; SOCKET listenFD; char Buff[1024]; int ret; WSAStartup(MAKEWORD(2,2),&wsa); listenFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(53764); server.sin_addr.s_addr=ADDR_ANY; ret=bind(listenFD,(sockaddr *)&server,sizeof(server)); ret=listen(listenFD,2); int iAddrSize = sizeof(server); SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize); /* 這段代碼是用來建立一個Tcp Server的,我們先申請一個socketfd, 使用53764(隨便,多少都行)作為這個socket連接的端口,bind他, 然后在這個端口上等待連接listen。程序阻塞在accept函數直到有 client連接上來。 */ SECURITY_ATTRIBUTES sa; sa.nLength=12;sa.lpSecurityDescriptor=0;sa.bInheritHandle=true; HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0); ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0); /* 創建兩個匿名管道。hReadPipe只能用來讀管道,hWritePipe1只能用來寫管道。 */ STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = hReadPipe2; si.hStdOutput = si.hStdError = hWritePipe1; char cmdLine[] = "cmd.exe"; PROCESS_INFORMATION ProcessInformation; ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformati on); /* 這段代碼創建了一個shell(cmd.exe),并且把cmd.exe的標准輸入用第二個管道的 讀句柄替換。cmd.exe的標准輸出和標准錯誤輸出用第一個管道的寫句柄替換。 這兩個管道的邏輯示意圖如下: (父進程) read<---〔管道一〕<---write 標准輸出(cmd.exe子進程) (父進程) write--->〔管道二〕--->read 標准輸入(cmd.exe子進程) */ unsigned long lBytesRead; while(1) { ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0); if(lBytesRead) { ret=ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0); if(!ret) break; ret=send(clientFD,Buff,lBytesRead,0); if(ret<=0) break; }else { lBytesRead=recv(clientFD,Buff,1024,0); if(lBytesRead<=0) break; ret=WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0); if(!ret) break; } } /* 這段代碼完成了客戶輸入和shell的交互。PeekNamedPipe用來異步的查詢管道一, 看看shell是否有輸出。如果有就readfile讀出來,并發送給客戶。如果沒有, 就去接受客戶的輸入。并writefile寫入管道傳遞給shell. 這兩個管道與client和server的配合邏輯圖如下: 輸入命令(Client) <-- send(父進程) read<--〔管道一〕<--write 標准輸出 (cmd.exe子進程) 獲得結果(Client) recv-->(父進程)write-->〔管道二〕-->read 標准輸入 (cmd.exe子進程) */ return 0; }這個程序是用wsocket 即windows的程式 但我開始學linux 有沒有高手能把它寫成一個linux 或給一個有同樣功能的程式源碼我 請問windows下的wsock 有linux下應用那個標頭檔 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |