我把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;beginver:=514;write('WSAStartup = ');trywsstatus:=WSAStartup(ver,rece);//初始化winsock;在windows下是必须的过程writeln(wsstatus);//winsock状态,0代表成功if wsstatus=0 thenbeginwriteln;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;finallywriteln;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? |