用 API 做的 ServerSocket 例子 (轉)
program Server;
{$APPTYPE CONSOLE}
uses
SysUtils,
Winsock,
;
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)+' Dinnect');
end;
//主
var
MyWSA: WSAData;
Svr,Clt: TSockAddr;
NameLen:Integer;
hSocket,s: TSocket;
TimeOut:integer;
ThreadCount:integer;
hThread:Thandle;
ThreadID:D;
Param:^TParam;
begin
If Wtartup(MAKEWORD(2,2), MyWSA) <> 0 Then //初始化
Begin
WSACleanup;
Writeln('WSAStartup() Fail');
Exit;
end;
hSocket := Socket(AF_, 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 :=_addr(PChar('127.0.0.1'));//server的為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.
//原始碼
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992164/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用一個通俗的例子講清楚APIAPI
- ServerSocket的問題Server
- TabStrip應用例子 (轉)
- 轉 轉別人寫的用dwr做聯動選單的例子,自己覺得也不錯
- 幾個行列轉換的實用小例子
- 用網上的API做一些有趣的事API
- android自帶的api的例子很多AndroidAPI
- JVM的ServerSocket是怎麼實現的(上)JVMServer
- JVM的ServerSocket是怎麼實現的(下)JVMServer
- 真正的 用JS 做的 loading (轉)JS
- ServerSocket實現簡單的廣播系統Server
- 用VB學做“駭客”程式 (轉)
- 用java實現一個簡單的序列化的例子(轉)Java
- 用java實現一個簡單的序列化的例子 (轉)Java
- 用API實現在MSN的資訊提示 (轉)API
- 行列轉換的一個例子
- JavaMail 傳送附件的例子 (轉)JavaAI
- 一個可逆加密的例子 (轉)加密
- java NIO SocketClinet ServerSocketJavaServer
- TinyXML應用例子XML
- 用CSS實現類似導航翻轉功能例子CSS
- 物件導向的方法在遊戲中的應用的一個例子(上)(轉)物件遊戲
- 物件導向的方法在遊戲中的應用的一個例子(下)(轉)物件遊戲
- 如 何 用 API 播 放 CD (轉)API
- 用api函式讀取硬碟的序列號 (轉)API函式硬碟
- TCP轉發伺服器的例子TCP伺服器
- 一個sql的行列轉置的例子SQL
- OC RunLoop應用例子OOP
- 用流(stream)技術做下載 (轉)
- [API] 用ASP建立MDaemon使用者 (轉)API
- 完整的oraclerman備份恢復的例子(轉)Oracle
- Nginx querystring 轉寫的兩個例子Nginx
- 一個用VB編寫的監控別人上網的軟體例子 (轉)
- iPhone 呼叫Web Service 例子(轉)iPhoneWeb
- MySQL 的 API 介面(轉)MySqlAPI
- 初用SOCKET做聊天室程式後所想到的…… (轉)
- 自己用VC來做自己的專業安裝程式 (轉)
- API設計原則(覺得太合適,轉發做記錄)API