用pascal写的最简单的winsock程序

2000年12月01日 16:49:00

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



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3198


本书以详尽资料和大量的范例深入讨论了有关32位Windows编程的高级问题,包括进程和线程的管理、Win32的内存管理、消息处理、动态链接库、文件系统和设备输入输出、结构化异常处理、Unicode等,并重点讨论了Windows 95和Windows NT在实现上的不同之处,其中包含了大量的编程技巧。 本书可供高等院校计算机专业的师生和广大的计算机编程人员使用。----------《Windows高级编程指南(第三版)》 原书: Advanced Windows (3rd Ed) 作者: Jeffrey Richter 译者: 王书洪 刘光明---------- 抽空将书中的C程序PASCAL了一遍, 由于水平所限, 可能存在错误, 仅供参考! 感谢网友chinesexing提供PDF电子书! 感谢老朋友savetime兄提供附书代码! 刘麻子 于 05年7月7号----------附上代码列表: CopyData -- 利用WM_COPYDATA跨进程传递数据 VMStat -- 显示虚拟内存状态 VMAlloc -- 使用虚拟内存 (保留、提交、回收、释放) VMMap -- 遍历VMMap.exe进程的虚拟内存空间 DIPS & -- 进入Explorer.exe进程以操作桌面项目 DIPSLib SysInfo -- 显示系统相关信息 MMFShare -- 利用内存映射共享数据 FileRev -- 利用内存映射处理文件 Counter -- 纤程例子 (后台纤程以低优先级作运算) DiskInfo -- 显示本地逻辑驱动器信息 MultInst -- 使用EXE中带有共享属性的PE节存储数据 TInjLib & -- 远程线程装载指定DLL到指定进程空间 ImgWalk LISLab -- 实验"局部输入状态" (Local Input State) TLSStat -- 在EXE模块中使用静态TLS TLSDyn & -- 在DLL模块中使用动态TLS SomeLib ModUse & -- 使用DLL中带有共享属性的PE节存储数据 Module DocStats -- 利用事件对象使多个线程协同工作 (统计文档) Mutexes -- 利用互斥对象使(计算/显示)两个线程同步 DirWalk -- 遍历DirWalk.exe所在磁盘目录树 FileChng -- 监视目录变化 CritSecs -- 利用临界区对象使(计算/显示)两个线程同步 SprMrkt -- 利用互斥对象和信号量对象控制"超市"运转 SEHSum -- 利用SEH机制, 修复堆栈溢出 SEHTerm -- 演示SEH终止处理和异常抛出 SEHExcpt -- 利用SEH机制, 稀疏提交数组内存 SEHSoft -- 抛出自定义异常通知程序清零记录 Bucket -- SWMRG复合同步对象 (单入/多读取) AlertIO -- 利用"回调通知"进行文件拷贝 (异步&分块) IOCmpPrt -- 利用"完成端口"进行文件拷贝 (异步&分块)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值