Delphi下連接埠複用的實現
來源:互聯網
上載者:User
其實連接埠複用聽起來很深奧的技術,其實很簡單,簡單得只需要一個函數就可以實現:
setsockopt( SOCKET s, int level, int optname, const char FAR *optval, int optlen );
參數: s Socket 的識別碼,level選項設定的 level ,optname 選項名稱 ,optval 選項的設定值 ,optlen 選項設定值的長度。
我只說一個參數,就是選項名稱的其中一個選項SO_REUSEADDR,稍微會一點英語的和有一點電腦基礎知識的都知道,這個選項後面的意思就是“重複使用地址”
我這裡把實現連接埠複用的代碼給出來,並給新手朋友們解釋一下:
var
sobinyshuai : bool;
myIP : string;
PORT : integer;
ServerSocket : TSocket;
SockAddrIn: TSockAddrIn;
WSAData: TWSAData;
begin
myIP:=’123.123.123.123’;{你自己的IP,為什麼要這個,下面會說}
sobinyshuai:=TRUE; {這句話的意思是,sobiny帥,賦值是肯定的回答。呵呵,開個玩笑。}
WSAStartUp(MakeWord(1, 1), WSAData);
ServerSocket := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0); {建造一個TCP的socket。}
setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, @sobinyshuai, sizeof(sobinyshuai));
{設定socket的狀態,還是關鍵的這一句SO_REUSEADDR,允許連接埠重用}
SockAddrIn.sin_family := AF_INET; {設定這個串連的,我都還不曉得有另外的選項沒,不過好象一直用這個。}
SockAddrIn.sin_addr.s_addr:=inet_addr(myIP); {設定這個串連的IP,這裡可以是INADDR_ANY這個選項,不過要是是INADDR_ANY的話,所有的外部的串連都會是這個,不過要是你複用的80連接埠,設定INADDR_ANY的話,後果可想而知。當然你程式要是辨別資料包當然沒問題}
SockAddrIn.sin_port := htons(Port); {設定這個串連的連接埠}
Bind(ServerSocket, SockAddrIn, SizeOf(SockAddrIn));{設定ServerSocket的屬性吧,應該這樣理解}
Listen(ServerSocket, 1); {設定監聽,等待串連。在Accept前只接受一個串連}
……
end;
連接埠複用就說完了,就這麼簡單,如果要加上什麼功能的話,請在邪惡八進位裡面搜尋一下我發的“綜合小工具”的原始碼,把裡面命令提示字元,註冊表類比等你喜歡的東西複製過來就可以了。這個文章說白了還是必須要有一點點程式基礎的朋友看的(各位超級新手的話,還是用別人的軟體好些。)我全用的是API的函數,稍微變形一下就可以在C++下用。
有3個PAS:Windows, Winsock2, Winsock;
其實我想連接埠複用的問題並不是想寫什麼駭客軟體,而是那天誇下海口說只需要利用一個webshell就實現各內網間的UDP通訊息,就必須涉及一下連接埠的複用,不然咋能行呢,如果有知道能UDP訪問HTTP的朋友一定告訴我方法。呵呵,先謝謝。
現在又有一個想法提出來,希望高手來指點一下:就是偷襲serv-u的方法,在找不到目錄,註冊表不能匯出使用者的時候,偷襲serv-u.我是這麼想的:因為在sendmessage給視窗可以發送訊息,經過實驗發現,serv-u的各個視窗都可以發送WM_SETTEXT改變文字,並且可以給執行許可權那裡發送點擊的資訊,再給應用那個按鈕發送點擊的資訊,得到各個盤的控制許可權,或者馬上通過serv-u設定系統管理員帳號(如果serv-u有這個許可權的話),不過問題就是,必須要管理員開啟serv-u設定使用者那一欄的時候,才能夠行得通。測試的時候在本機GUEST許可權下,這個程式是行得通的,直接又加了一個管理員,就是不知道在webshell下的執行效果會怎麼樣,如果有條件的朋友可以試試.