用pascal写的最简单的winsock程序

    技术2022-05-11  96

    我把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?


    最新回复(0)