線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1694
推到 Plurk!
推到 Facebook!

用API做的ServerSocket範例

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-18 10:57:58 IP:61.218.xxx.xxx 未訂閱

用API做的ServerSocket範例

資料來源:http://ono.3322.org program Server; {$APPTYPE CONSOLE} uses SysUtils, Winsock, Windows; type TParam=record TrdId:integer; Sckt:TSocket; end; //子線程函數 function ChildThrd(p:Pointer):LongInt;stdcall; var PkLen:integer; ThreadId:integer; ASocket:TSocket; buf:array[0..63] of char; begin Result:=0; ThreadId:=TParam(p^).TrdId; ASocket:=TParam(p^).Sckt; Writeln('Thread ' IntToStr(ThreadId) ' Create'); PkLen:=1; while PkLen>0 do begin FillChar(buf,SizeOf(buf),0); PkLen:=Recv(ASocket,buf,SizeOf(buf),0); //接收數據 Write(buf); if PkLen>0 then begin Send(ASocket,buf,PkLen,0);//發送數據 end; end; CloseSocket(ASocket); //關閉socket Dispose(p); Writeln('Thread ' IntToStr(ThreadId) ' End'); Writeln('Socket ' IntToStr(ASocket) ' DisConnect'); end; //主程序 var MyWSA: WSAData; Svr,Clt: TSockAddr; NameLen:Integer; hSocket,s: TSocket; TimeOut:integer; ThreadCount:integer; hThread:Thandle; ThreadID:DWord; Param:^TParam; begin If WSAStartup(MAKEWORD(2,2), MyWSA) <> 0 Then //初始化 Begin WSACleanup; Writeln('WSAStartup() Fail'); Exit; end; hSocket := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //創建socket If hSocket = INVALID_SOCKET Then Begin WSACleanup; Writeln('Socket() Fail'); Exit; End; Svr.sin_family := AF_INET; Svr.sin_port := htons(176); //server端口號為176 Svr.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));//server的ip地址為127.0.0.1 If Bind(hSocket, Svr, SizeOf(Svr)) = SOCKET_ERROR Then //綁定socket Begin CloseSocket(hSocket); WSACleanup; Writeln('Bind() Fail'); Exit; end; if Listen(hSocket,256) = SOCKET_ERROR Then //socket開始偵聽,最大同時連接數為256個 begin CloseSocket(hSocket); WSACleanup; Writeln('Listen() Fail'); Exit; end; TimeOut:=3000; ThreadCount:=0; Writeln('Listening......'); while true do begin NameLen:=SizeOf(Clt); s:=Accept(hSocket,@Clt,@NameLen);//接受一個連接 if s = SOCKET_ERROR Then begin CloseSocket(hSocket); WSACleanup; Writeln('Accept() Fail'); Exit; end else begin Writeln('Socket ' IntToStr(s) ' Connect'); if SetSockOpt(s,SOL_SOCKET,SO_RCVTIMEO,PChar(@TimeOut),SizeOf(TimeOut))=SOCKET_ERROR then //設置接收超時為3秒 begin CloseSocket(s); CloseSocket(hSocket); WSACleanup; Writeln('SetSockOpt() Fail'); Exit; end; if SetSockOpt(s,SOL_SOCKET,SO_SNDTIMEO,PChar(@TimeOut),SizeOf(TimeOut))=SOCKET_ERROR then //設置發送超時為3秒 begin CloseSocket(s); CloseSocket(hSocket); WSACleanup; Writeln('SetSockOpt() Fail'); Exit; end; new(Param); Param^.TrdId:=ThreadCount; Param^.Sckt:=s; hThread:=CreateThread(nil,0,@ChildThrd,Param,0,ThreadID); //創建childthrd子線程 if hThread=0 then begin Writeln('CreateThread() Fail'); end else begin Inc(ThreadCount); end; end; end; CloseSocket(hSocket); //關閉socket WSACleanup; end. 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
系統時間:2024-05-04 10:06:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!