用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Delphi

用pascal写的最简单的winsock程序

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:20:53

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

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:15,437.50000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号