Delphi下的winsock-api 函数(一)

  winsock 是网络编程的接口,它是Tcp/IP协议的一种封装;

  下面关于一些winsock api常用函数和基本定义:

 

      要通过winsock建立通信,必需了解如何利用指定的协议为工作站定址。winsock2中引入了几个新的、与协议无关的函数,他们可以和任何一个地址家族一起使用;但是大多数情况下了,各个协议家族都有自己的地址解析机制,要么通过一个函数,要么作为一个投给getsockopt的选项。

  ① IP

      网际协议(InternetProtocol ,IP)是一种用于互联网的网络协议,IP是一个无连接的协议,不能保证传递完全不会出错,(Tcp、Udp)两个高级于IP用于依赖IP协议的数据通信

  ②  Tcp     

      Tcp 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。

关于流数据传输,TCP 交付一个由序列号定义的无结构的字节流。这个服务对应用程序有利,因为在送出到 TCP 之前应用程序不需要将数据划分成块,TCP 可以将字节整合成字段,然后传给 IP 进行发送。

TCP 通过面向连接的、端到端的可靠数据报发送来保证可靠性。TCP 在字节上加上一个递进的确认序列号来告诉接收者发送者期望收到的下一个字节。如果在规定时间内,没有收到关于这个包的确认响应,重新发送此包。TCP 的可靠机制允许设备处理丢失、延时、重复及读错的包。超时机制允许设备监测丢失包并请求重发。

TCP 提供了有效流控制。当向发送者返回确认响应时,接收 TCP 进程就会说明它能接收并保证缓存不会发生溢出的最高序列号。

全双工操作:TCP 进程能够同时发送和接收包。

TCP 中的多路技术:大量同时发生的上层会话能在单个连接上时进行多路复用。

  ③ Udp

      UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。 UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当

  

UDP

它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

  (2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

  (3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

  (4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。  

UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。

  

UDP

TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。 与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议

  相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突法性的多个数据报。不同于TCP,UDP并不能确保数据的发送和接收顺序。例如,一个位于客户端的应用程序向服务器发出了以下4个数据报

  D1

  D22

  D333

  D4444

  但是UDP有可能按照以下顺序将所接收的数据提交到服务端的应用:

  D333

  D1

  D4444

  D22

  事实上,UDP协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。

  定址
       IP中,计算机都分配有一个IP地址,用一个32位数来表示,正式的称呼是“IPv4地址”。客户机需要通过TCP或UDP和服务器通信时,必须指定服务器的IP地址和服务端口号。另外,服务器打算监听接入客户机请求时,也必须指定一个IP地址和一个端口号。Winsock中,应用通过SOCKADDR_IN结构来指定I P地址和服务端口信息,该结构的在DELPHI中的声明如下:
  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;
        在DELPHI中,sockaddr_in结构被声明为了一个变体记录(关于变体记录可以参看我其他的文章)。sin_family: 字段必须设为AF_INET,以告知Winsock我们此时正在使用I P地址家族。

        准备使用哪个TCP或UDP通信端口来标识服务器服务这一问题,则由sin_port字段定义。在选择端口时,应用必须特别小心,因为有些可用端口号是为“已知的”(即固定的)服务保留的(比如说文件传输协议和超文本传输协议,即FTP和HTTP)。“已知的协议”,即固定协议,采用的端口由“互联网编号分配认证(IANA)”控制和分配,RFC 1700中说明编号。从本质上说,端口号分为下面这三类:“已知”端口、已注册端口、动态和(或)私用端口。
■ 0~1023由IANA控制,是为固定服务保留的。
■ 1024 ~ 49151是IANA列出来的、已注册的端口,供普通用户的普通用户进程或程序使用。
■ 49152 ~ 65535是动态和(或)私用端口。
   普通用户应用应该选择1024 ~ 49151之间的已注册端口,从而避免端口号已被另一个应用或系统服务所用。此外, 49152 ~ 65535之间的端口可自由使用,因为IANA这些端口上没有注册服务。在使用bind API函数时,如果一个应用和主机上的另一个应用采用的端口号绑定在一起,系统就会返回Winsock错误WSAEADDRINUSE。sockaddr_in 结构的sin_addr字段用于把一个IP地址保存为一个4字节的数,它是无符号长整数类型。根据这个字段的不同用法,还可表示一个本地或远程IP地址。IP地址一般是用“互联网标准点分表示法”(像a.b.c.d一样)指定的,每个字母代表一个字节数,从左到右分配一个4字节的无符号长整数。最后一个字段sin_ zero ,只充当填充项的职责,以使sockaddr_in 结构和SOCKADDR结构的长度一样。一个有用的、名为inet_addr的支持函数,可把一个点式IP地址转换成一个32位的无符号长整数。它的定义如下:
unsigned long inet_addr(
const char FAR *cp
);

cp字段是一个空中止字符串,它认可点式表示法的IP地址。注意,这个函数把IP地址当作一个按网络字节顺序排列的32位无符号长整数返回.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值