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.
//源码下载 http://ono.3322.org/mysoft/serversocket.zip
[办公软件]点击Excel单元格就出现下拉列表框可以选择数据是怎… [电脑技术]使用?和*两个通配符迅速批量(搜索)查找文件 [聊天工具]快速又高效 用Email免费发送网络传真__天极Yesky [常用软件]网管工具 用OH协助服务器进行安全监控 [常用软件]留住精彩 用“数码故事”制作DVD光碟 [常用软件]小块头有大智慧 用Nero轻松设计个性化光盘 [常用软件]技高一筹 用Winamp播放影碟 [VB.NET程序]Auto Complete combo Box(VB.NET Source Use API… [VB.NET程序]在 VB 中使用 Unicode API [VB.NET程序]用 VB 实现表单的自动提交
|