我把socket编程教程的第一个例子改写了一下 服务器接受客户信息,再反送回去
实际上是直接调用win api 在delphi4下用命令行编译 dcc32 -cc server1.pas 用windows自带的telnet测试
server1.pas: program server1;
uses windows,winsock;
const myport=1414;//预定义口
{type sockaddr_in = record case Integer of 0: (sin_family: u_short; sin_port: u_short; sin_addr: TInAddr; sin_zero: array[0..7] of Char); 1: (sa_family: u_short; sa_data: array[0..13] of Char) end; TSockAddrIn = sockaddr_in; PSOCKADDR = ^TSockAddr; TSockAddr = sockaddr_in;
WSAData = record // !!! also WSDATA wVersion: Word; wHighVersion: Word; szDescription: array[0..WSADESCRIPTION_LEN] of Char; szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char; iMaxSockets: Word; iMaxUdpDg: Word; lpVendorInfo: PChar; end; TWSAData = WSAData;
end }
var str:string; s,ns:TSocket;//type:u_int|integer; ver:word; rece:TWSAData;//type:WSAData; wsstatus:integer;//winsocket_status; i,pktlen:integer; szd:array[0..WSADESCRIPTION_LEN] of Char; szs:array[0..WSASYS_STATUS_LEN] of Char; server:TSockAddr;//tpye:sockaddr_in client:PSockAddr;//type:^sockaddr_in namelen:PInteger;//type:^Integer; buf:array[0..1023] of char;
begin ver:=514; write(''''WSAStartup = ''''); try wsstatus:=WSAStartup(ver,rece); //初始化winsock;在windows下是必须的过程 writeln(wsstatus);//winsock状态,0代表成功 if wsstatus=0 then begin writeln; writeln(''''********************************************************************************''''); //以下显示winsock状态 write(''''wVersion = ''''); writeln(rece.wVersion); write(''''wHighVersion = ''''); writeln(rece.wHighVersion); write(''''iMaxSockets = ''''); writeln(rece.iMaxSockets); write(''''iMaxUdpDg = ''''); writeln(rece.iMaxUdpDg); writeln(''''szDescription is ''''); for i:=0 to WSADESCRIPTION_LEN do write(szd[i]); writeln; writeln(''''szSystemStatus is ''''); for i:=0 to WSASYS_STATUS_LEN do write(szs[i]); writeln; writeln(''''********************************************************************************''''); end;
write(''''socket = ''''); s:=socket(AF_INET,SOCK_STREAM,0); //第一步,建立服务器的socket,0表示成功 writeln(s); if s<0 then exit;
write(''''bind = ''''); server.sin_family := AF_INET; server.sin_port := htons(myport); server.sin_addr.s_addr := INADDR_ANY; wsstatus:=bind(s,server,sizeof(server)); //第二步,绑定,0表示成功 writeln(wsstatus); if wsstatus<>0 then exit;
write(''''listen = ''''); wsstatus:=listen(s,5); //第三步,监听 writeln(wsstatus); if wsstatus<>0 then exit;
write(''''accept = ''''); new(client); new(namelen); namelen^:=sizeof(client^); ns:=accept(s,client,namelen); //第四步,等待接收 //注:bind时传递的是sockaddr_in结构的数据,accept时是两个指针!!! if ns=-1 then //以下可以做成多线程过程 begin writeln(-1); exit; end else begin writeln(ns); pktlen:=0; writeln(''''recv''''); repeat pktlen:= recv(ns,buf,1024,0);//接收数据 //pktlen=为接收长度,0表示断开联接,<0表示失败 sleep(1); write(pktlen:5); if pktlen>0 then begin i:=send(ns,buf,pktlen,0);//返回数据 end; until pktlen<1;//循环直到客户断开联接 end; finally writeln; writeln(''''********************************************************************************''''); writeln(''''Press to exit winsocket''''); readln(str); wsstatus:=WSACleanup();//退出winsocket; write(''''WSACleanup = ''''); writeln(wsstatus); end; writeln; writeln(''''Press to exit''''); readln(str); end.
补充日期: 2000-07-22 10:37:10
二进制代码在 http://mamahu.363.net/server1.exe 我要离开南京了,临行前做个纪念,我会想念大家的
BTW: .abu. , how about "http://www.patching.net" now?
[常用软件]在POWERBUILDER中使用WINSOCK控件的方法 [VB.NET程序]如何在vb 中用api函数代替winsock控件建立网络连接… [Delphi程序]Delphi Winsock Hooking Example by Aphex [Delphi程序]winsock 函数简介
|