转贴一篇:
服务器接受客户信息,再反送回去,实际上是直接调用win api
用命令行编译 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
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
SockAddr;//type:^sockaddr_in
namelen
Integer;//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
);
writeln;
writeln('szSystemStatus is ');
for i:=0 to WSASYS_STATUS_LEN do write(szs);
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 <ENTER> to exit winsocket');
readln(str);
wsstatus:=WSACleanup();//退出winsocket;
write('WSACleanup = ');
writeln(wsstatus);
end;
writeln;
writeln('Press <ENTER> to exit');
readln(str);
end.