WSA是windows socket API简称,网络的一些基本函数, 这些函数根据功能的不同可以分为如下几类:
(1) 套接字函数。此类函数包括sockets(),bind(),getpeername(),getsockname()和closesocket(),它们主要完成创建,关闭套接字功能,以及对套接字命名与名字获取。
(2) 网络连接函数。此类函数包括listen(),accept(),connect()和shutdown(),它们完成网络连接(如虚电路)的建立与关闭。此类函数中有部分可阻塞。
(3) 数据传输函数。此类函数包括send(),recv(),sendto()和recvfrom(),它们完成网络数据的发送与接收,全部是可以阻塞的函数。
(4) 字节定序函数。此类函数包括htonl(),htons(),ntohl()和ntohs(),它们完成主机和网络之间数据字节顺序的转换。
(5) 地址转换函数。此类函数包括inet_addr(),inet_ntoa(),它们完成网络字符串地址和Internet地址之间的转换。
(6) 套接字控制函数。此类函数包括getsockopt(),setsockopt(),ioctlsocket()和select(),它们设置/获取套接字的选项,控制/检测套接字的工作状态。其中select()函数在必要时可能阻塞。
只使用了上述函数的Berkeley Sockets源程序基本上可以不加修改地移植到Windows Sockets环境中来。但是,移植过来的程序有一个最大的问题是“阻塞”。在Berkeley Sockets中,套接字默认的工作模式是操作处于阻塞方式,一个阻塞操作可能阻塞整个Windows环境。在非抢先Windows环境,强烈推荐程序员使用非阻塞(异步)操作,也就是说,推荐使用Windows Sockets提供的异步选择函数代替可能阻塞的select()函数,并且用网络事件消息来驱动可能阻塞的网络连接函数(accept()和connect())和数据传输函数,这样设计的程序能更好地工作。
* = 在某些条件下此例程可能阻塞。
1. 在delphi用windows socket API时,应先先明
WSAStartup() //初始
例:
var WSData: TWSAData;
begin
if WSAStartup($0202,WSData) = 0 then
begin
// 成功返回 0
end;
end
WSACleanup;//注销
2、socket函数
用于生成socket(soket Descriptor)
[声明]
SOCKET socket(int af,int type,int protocol);
[参数]
af - 地址家族(通常使用:AF_INET)
type - socket的种类
SOCK_STREAM : 用于TCP协议
SOCK_DGRAM : 用于UDP协议
protocol - 所使用的协议
[返回值]
当函数成功调用时返回一个新的SOCKET(Socket Descriptor)
失败时返回INVALID_SOCKET.
[例]
var FSocket: Tsocket;
begin
FSocket:=Socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); // FSocket = INVALID_SOCKET 创建失败
end;
3、inet_addr函数
把好象"xxx.xxx.xxx.xxx"的10进制的IP地址转换为32位整数表示方法
[声明]
unsigned long inet_addr ( const char FAR *cp );
[参数]
cp - 指向用"xxx.xxx.xxx.xxx"的10进制来表示的IP地址字符串的指针
[返回值]
当函数成功调用时返回用32位整数表示的IP地址(按网络字节排列顺序)
失败时返回INADDR_NONE.
4、gethostbyname函数
可以从主机名获取主机资料.
[声明]
struct hostent FAR * gethostbyname ( const char FAR *name );
[参数]
name - 指向主机名字符串的指针
[返回值]
当函数成功调用时返回主机信息
失败时返回NULL(空值)
5、Bind函数
指定本地IP地址所使用的端口号时候使用
[声明]
int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
addr - 指向Socket地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
[例]
var
Addr:TSockAddr;
begin
FillChar(Addr,SizeOf(Addr), 0); //对Addr 赋 0 值
Addr.sin_family := AF_INET;
Addr.sin_port := htons(APort); //Aport本地端口
Addr.sin_addr.S_addr := INADDR_ANY;
if bind(FSocket,@Addr,SizeOf(Addr))=0 then
begin
//成功绑定本地端口号
end;
end;
6、connect函数
用于与服务器建立连接,发出连接请求,必须在参数中指定服务器的IP地址和端口号
[声明]
int connect (SOCKET s , const struct sockaddr FAR *name , int namelen );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
name - 指向服务器地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
[例]
var
Addr:TSockAddr;
begin
FillChar(Addr,SizeOf(Addr), 0);
Addr.sin_family := AF_INET;
Addr.sin_port := htons(APort); //Aport 服务器端口
Addr.sin_addr.S_addr := inet_addr(pchar(AIP));//AIP 服务器IP地址
if Connect(FSocket,@Addr,sizeof(Addr))=0 then
begin
//与服务器建立连接
end;
end;
7、select函数
可以用于调查一个或多个SOCKET的状态.
[声明]
int select ( int nfds , fd_set FAR *readfds , fd_set FAR *writefds , fd_set FAR *exceptfds , const struct timeval FAR *timeout );
[参数]
nfds - 在WINDOWS SOCKET API 中该参数可以忽略,通常赋予NILL值
readfds - 由于接受的SOCKET设备的指针
writefds - 用于发送数据的SOCKET设备的指针
exceptfds - 检查错误的状态
timeout - 超时设定
[返回值]
返回大于0的值时,表示与条件相符的SOCKET数
返回0表示超时
失败时返回SOCKET_ERROR
8、recv函数
利用Socket进行接受数据.
[声明]
int recv ( SOCKET s , char FAR *buf , int len , int flags );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
buf - 接受数据的缓冲区(数组)的指针
len - 缓冲区的大小
flag - 调用方式(MSG_PEEK 或 MSG_OOB)
[返回值]
成功时返回收到的字节数.
如果连接被中断则返回0
失败时返回 SOCKET_ERROR
9、sendto函数
利用Socket进行发送数据.
[声明]
int sendto ( SOCKET s , const char FAR *buf , int len , int flags , const struct sockaddr FAR *to , int token );
[参数]
s - 指向用Socket函数生成的Socket Descriptor
buf - 接受数据的缓冲区(数组)的指针
len - 缓冲区的大小
flag - 调用方式(MSG_DONTROUTE , MSG_OOB)
to - 指向发送方SOCKET地址的指针
token - 发送方SOCKET地址的大小
[返回值]
成功时返回已经发送的字节数.
失败时返回SOCKET_ERROR
10、accept() *
确认外来连接,并将它与一个立即建立的数据套接字联系起来。原始套接字返回到监听状态。
11、closesocket() *
从进程对象参考表中删去一个套接字,只有当SO_LINGER设置时才阻塞。
12、getpeername()
获取与指定套接字连接的对等方的名字。
13、getsockname()
获取指定套接字的当前名字。
14、getsockopt()
获取与指定套接字相关的选项。
15、htonl()
将一个32位数从主机字节顺序转换为网络字节顺序。
16、htons()
将一个16位数从主机字节顺序转换为网络字节顺序。
17、inet_addr()
将一个用网际标准点分表示法表示的字符串地址转换成网际地址值。
18、inet_ntoa()
将一个网际地址值转换成一个用点分十进制表示法表示的字符串地址
19、ioctlsocket()
为套接字提供控制。
20、listen()
在指定套接字上监听外来连接。
21、ntohl()
将一个32位数从网络字节顺序转换为主机字节顺序。
22、ntohs()
将一个16位数从网络字节顺序转换为主机字节顺序。
23、recvfrom() *
从一个连接或未连接的套接字上接收数据。
24、send() *
给一个连接套接字发送数据。
25、setsockopt()
设置与指定套接字相关的选项。
26、shutdown()
关闭全双工连接的一部分。
27、gethostbyaddr() *
通过网络地址获取主机名字和地址等信息。
28、gethostbyname() *
通过主机名字获取主机名字和地址等信息。
29、gethostname()
获取本地主机名。
30、getprotobyname() *
通过协议名获取协议名和协议号等信息。
31、getprotobynumber() *
通过协议号获取协议名和协议号等信息。
32、getservbyname() *
通过服务名获取服务的名字和端口等信息。
33、getservbyport() *
通过端口获取服务的名字和端口等信息。