关闭

WinSock之基础API(二)

标签: apipascalinternetsocket网络windows
941人阅读 评论(0) 收藏 举报
分类:

WinSock之基础API(二)

                                      

 

5.1.6 getsockname()

 

简述:

 

  获取一个套接口的本地名字。

 

  #include <winsock.h>

 

  int PASCAL FAR getsockname( SOCKET s, struct sockaddr FAR* name,

 

  int FAR* namelen);

 

  s:标识一个已捆绑套接口的描述字。

 

  name:接收套接口的地址(名字)。

 

  namelen:名字缓冲区长度。

 

注释:

 

  getsockname()函数用于获取一个套接口的名字。它用于一个已捆绑或已连接套接口s,本地地址将被返回。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。

 

  若一个套接口与INADDR_ANY捆绑,也就是说该套接口可以用任意主机的地址,此时除非调用connect()accept()来连接,否则getsockname()将不会返回主机IP地址的任何信息。除非套接口被连接,WINDOWS套接口应用程序不应假设IP地址会从INADDR_ANY变成其他地址。这是因为对于多个主机环境下,除非套接口被连接,否则该套接口所用的IP地址是不可知的。

 

 

返回值:

 

  若无错误发生,getsockname()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

 

错误代码:

 

  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()

 

  WSAENETDOWNWINDOWS套接口实现检测到网络子系统失效。

 

  WSAEFAULTnamelen参数不够大。

 

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

 

  WSAENOTSOCK:描述字不是一个套接口。

 

  WSAEINVAL:套接口未用bind()捆绑。

 

 

参见:

 

  bind(), socket(), getpeername().

 

 

 

5.1.7 getsockopt()

 

简述:

 

  获取一个套接口选项。

 

 

  #include <winsock.h>

 

  int PASCAL FAR getsockopt( SOCKET s, int level, int optname,

 

  char FAR* optval, int FAR* optlen);

 

  s:一个标识套接口的描述字。

 

  level:选项定义的层次。支持的层次仅有SOL_SOCKETIPPROTO_TCP

 

  optname:需获取的套接口选项。

 

  optval:指针,指向存放所获得选项值的缓冲区。

 

  optlen:指针,指向optval缓冲区的长度值。

 

 

注释:

 

  getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。在不同协议层上存在选项,但往往是在最高的套接口层次上,设置选项影响套接口的操作,诸如操作的阻塞与否、包的选径方式、带外数据的传送等。

 

  被选中选项的值放在optval缓冲区中。optlen所指向的整形数在初始时包含缓冲区的长度,在调用返回时被置为实际值的长度。对SO_LINGER选项而言,相当于linger结构的大小,对其他选项来说,是一个整形数的大小。

 

  如果未进行setsockopt()调用,则getsockopt()返回系统缺省值。

 

  getsockopt()支持下列选项。其中类型栏指出了optval所指向的值。仅有TCP_NODELAY选项使用了IPPROTO_TCP层;其余选项均使用SOL_SOCKET层。

 

 

选项        类型        意义

 

SO_ACCEPTCONN   BOOL        套接口正在用listen()监听。

 

SO_BROADCAST    BOOL        套接口设置为传送广播信息。

 

SO_DEBUG    BOOL        允许调试。

 

SO_DONTLINER    BOOL        若为真,则SO_LINGER选项被禁止。

 

SO_DONTROUTE    BOOL        禁止选径。

 

SO_ERROR    int     获取错误状态并清除。

 

SO_KEEPALIVE    BOOL        发送保持活动信息。

 

SO_LINGER   struct linger FAR*  返回当前各linger选项。

 

SO_OOBINLINE    BOOL        在普通数据流中接收带外数据。

 

SO_RCVBUF   int     接收缓冲区大小。

 

SO_REUSEADDR    BOOL        套接口能和一个已在使用中的地址捆绑。

 

SO_SNDBUF   int     发送缓冲区大小。

 

SO_TYPE     int     套接口类型(如SOCK_STREAM)。

 

TCP_NODELAY BOOL        禁止发送合并的Nagle算法。

 

 

getsockopt()不支持的BSD选项有:

 

 

选项名      类型        意义

 

SO_RCVLOWAT int     接收低级水印。

 

SO_RCVTIMEO int     接收超时。

 

SO_SNDLOWAT int     发送低级水印。

 

SO_SNDTIMEO int     发送超时。

 

IP_OPTIONS          获取IP头中选项。

 

TCP_MAXSEG  int     获取TCP最大段的长度。

 

  用一个未被支持的选项去调用getsockopt()将会返回一个WSAENOPROTOOPT错误代码(可用WSAGetLastError()获取)。

 

 

返回值:

 

  若无错误发生,getsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

 

 

 

错误代码:

 

  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()

 

  WSAENETDOWNWINDOWS套接口实现检测到网络子系统失效。

 

  WSAEFAULToptlen参数非法。

 

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

 

  WSAENOPROTOOPT:未知或不支持选项。其中,SOCK_STREAM类型的套接口不支持SO_BROADCAST选项,SOCK_DGRAM类型的套接口不支持SO_ACCEPTCONNSO_DONTLINGER SO_KEEPALIVESO_LINGERSO_OOBINLINE选项。

 

  WSAENOTSOCK:描述字不是一个套接口。

 

 

参见:

 

  setsockopt(), WSAAsyncSelect(), socket().

 

 

5.1.8 htonl()

 

简述:

 

  将主机的无符号长整形数转换成网络字节顺序。

 

  #include <winsock.h>

 

  u_long PASCAL FAR htonl( u_long hostlong);

 

  hostlong:主机字节顺序表达的32位数。

 

注释:

 

  本函数将一个32位数从主机字节顺序转换成网络字节顺序。

 

返回值:

 

  htonl()返回一个网络字节顺序的值。

 

参见:

 

  htons(), ntohl(), ntohs().

 

 

 

 

5.1.9 htons()

 

简述:

 

  将主机的无符号短整形数转换成网络字节顺序。

 

  #include <winsock.h>

 

  u_short PASCAL FAR htons( u_short hostshort);

 

  hostshort:主机字节顺序表达的16位数。

 

注释:

 

  本函数将一个16位数从主机字节顺序转换成网络字节顺序。

 

返回值:

 

  htons()返回一个网络字节顺序的值。

 

参见:

 

  htonl(), ntohl(), ntohs(). 

 

 

5.1.10 inet_addr()

 

简述:将一个点间隔地址转换成一个in_addr

 

  #include <winsock.h>

 

  unsigned long PASCAL FAR inet_addr( const struct FAR* cp);

 

  cp:一个以Internet标准.间隔的字符串。

 

注释:

 

  本函数解释cp参数中的字符串,这个字符串用Internet.间隔格式表示一个数字的Internet地址。返回值可用作Internet地址。所有Internet地址以网络字节顺序返回(字节从左到右排列)

 

  Internet地址用.间隔的地址可有下列几种表达方式:

 

  a.b.c.da.b.ca.ba

 

  当四个部分都有定值时,每个都解释成一个字节数据,从左到右组成Internet四字节地址。请注意,当一个Internet地址在Intel机器上表示成一个32位整型数时,则上述的字节为d.c.b.a。这是因为Intel处理器的字节是从右向左排列的。

 

  请注意:只有Berkeley支持下述表达法,Internet其余各处均不支持。考虑到与软件的兼容性,应按规定进行使用。

 

  对一个三部分地址,最后一部分解释成16位数据并作为网络地址的最右两个字节。这样,三部分地址便很容易表示B组网络地址,如128.net.host.

 

  对一个两部分地址,最后一部分解释成24位数据并作为网络地址的最右三个字节,这样,两部分地址便很容易表示C组网络地址,如net.host

 

  对仅有一个部分的地址,则将它的值直接存入网络地址不作任何字节的重组。

 

 

返回值:

 

  若无错误发生,inet_addr()返回一个无符号长整型数,其中以适当字节顺序存放Internet地址。如果传入的字符串不是一个合法的Internet地址,如a.b.c.d地址中任一项超过255,那么inet_addr()返回INADDR_NONE

 

 

参见:

 

  inet_ntoa().

 

 

5.1.11 inet_ntoa()

 

简述:

 

  将网络地址转换成.点隔的字符串格式。

 

  #include <winsock.h>

 

 

  char FAR* PASCAL FAR inet_ntoa( struct in_addr in);SOCKADDR_IN

 

  in:一个表示Internet主机地址的结构。

 

注释:

 

  本函数将一个用in参数所表示的Internet地址结构转换成以. 间隔的诸如a.b.c.d的字符串形式。请注意inet_ntoa()返回的字符串存放在WINDOWS套接口实现所分配的内存中。应用程序不应假设该内存是如何分配的。在同一个线程的下一个WINDOWS套接口调用前,数据将保证是有效。

 

返回值:

 

  若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NVLL。其中的数据应在下一个WINDOWS套接口调用前复制出来。

 

参见:

 

  inet_addr().

 

 

 

5.1.12 ioctlsocket()

 

简述:

 

  控制套接口的模式。

 

  #include <winsock.h>

 

  int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp);

 

  s:一个标识套接口的描述字。

 

  cmd:对套接口s的操作命令。

 

  argp:指向cmd命令所带参数的指针。

 

 

注释:

 

  本函数可用于任一状态的任一套接口。它用于获取与套接口相关的操作参数,而与具体协议或通讯子系统无关。支持下列命令:

 

  FIONBIO:允许或禁止套接口s的非阻塞模式。argp指向一个无符号长整型。如允许非阻塞模式则非零,如禁止非阻塞模式则为零。当创建一个套接口时,它就处于阻塞模式(也就是说非阻塞模式被禁止)。这与BSD套接口是一致的。WSAAsynSelect()函数将套接口自动设置为非阻塞模式。如果已对一个套接口进行了WSAAsynSelect() 操作,则任何用ioctlsocket()来把套接口重新设置成阻塞模式的试图将以WSAEINVAL失败。为了把套接口重新设置成阻塞模式,应用程序必须首先用WSAAsynSelect()调用(IEvent参数置为0)来禁至WSAAsynSelect()

 

  FIONREAD:确定套接口s自动读入的数据量。argp指向一个无符号长整型,其中存有ioctlsocket()的返回值。如果sSOCKET_STREAM类型,则FIONREAD返回在一次recv()中所接收的所有数据量。这通常与套接口中排队的数据总量相同。如果SSOCK_DGRAM 型,则FIONREAD返回套接口上排队的第一个数据报大小。

 

  SIOCATMARK:确实是否所有的带外数据都已被读入。这个命令仅适用于SOCK_STREAM类型的套接口,且该套接口已被设置为可以在线接收带外数据(SO_OOBINLINE)。如无带外数据等待读入,则该操作返回TRUE真。否则的话返回FALSE假,下一个recv()recvfrom()操作将检索标记前一些或所有数据。应用程序可用SIOCATMARK操作来确定是否有数据剩下。如果在紧急(带外)数据前有常规数据,则按序接收这些数据(请注意,recv()recvfrom()操作不会在一次调用中混淆常规数据与带外数据)。argp指向一个BOOL型数,ioctlsocket()在其中存入返回值。

 

兼容性:

 

  本函数为Berkeley套接口函数ioctl()的一个子集。其中没有与FIOASYNC等价的命令,SIOCATMARK是套接口层次支持的唯一命令。

 

返回值:

 

  成功后,ioctlsocket()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

 

错误代码:

 

  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()

 

  WSAENETDOWNWINDOWS套接口实现检测到网络子系统失效。

 

  WSAEINVALcmd为非法命令,或者argp所指参数不适用于该cmd命令,或者该命令

 

不适用于此种类型的套接口。

 

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

 

  WSAENOTSOCK:描述字不是一个套接口。

 

参见:

 

  socket(), setsockopt(), getsockopt(), WSAAsyncSelect().

 

 

 

5.1.13 listen()

 

简述:

 

  创建一个套接口并监听申请的连接.

 

  #include <winsock.h>

 

  int PASCAL FAR listen( SOCKET s, int backlog);

 

  S:用于标识一个已捆绑未连接套接口的描述字。

 

  backlog:等待连接队列的最大长度。

 

 

注释:

 

  为了接受连接,先用socket()创建一个套接口,然后用listen()为申请进入的连接建立一个后备日志,然后便可用accept()接受连接了。listen()仅适用于支持连接的套接口,如SOCK_STREAM类型的。套接口s处于一种变动模式,申请进入的连接请求被确认,并排队等待被接受。这个函数特别适用于同时有多个连接请求的服务器;如果当一个连接请求到来时,队列已满,那么客户将收到一个WSAECONNREFUSED错误。

 

  当没有可用的描述字时,listen()函数仍试图正常地工作。它仍接受请求直至队列变空。当有可用描述字时,后续的一次listen()accept()调用会将队列按照当前或最近的后备日志重新填充,如有可能的话,将恢复监听申请进入的连接请求。

 

兼容性:

 

  后备日志当前被(默认地)限制为5。如同4.3 BSD Unix中的一样,小于1或大于5的数都会被舍入最近的有效值。

 

返回值:

 

  如无错误发生,listen()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码

 

错误代码:

 

  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()

 

  WSAENETDOWNWINDOWS套接口实现检测到网络子系统失效。

 

  WSAEADDRINUSE:试图用listen()去监听一个正在使用中的地址。

 

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

 

  WSAEINVAL:该套接口未用bind()进行捆绑,或已被连接。

 

  WSAEISCONN:套接口已被连接。

 

  WSAEMFILE:无可用文件描述字。

 

  WSAENOBUFS:无可用缓冲区空间。

 

  WSAENOTSOCK:描述字不是一个套接口。

 

  WSAEOPNOTSUPP:该套接口不正常listen()调用。

 

参见:

 

  accept(), connet(), socket().

 

 

 

5.1.14 ntohl()

 

简述:

 

  将一个无符号长整形数从网络字节顺序转换为主机字节顺序。

 

  include <winsock.h>

 

  u_long PASCAL FAR ntohl( u_long netlong);

 

  netlong:一个以网络字节顺序表达的32位数。

 

 

注释:

 

  本函数将一个32位数由网络字节顺序转换为主机字节顺序。

 

返回值:

 

  ntohl()返回一个以主机字节顺序表达的数。

 

参见:

 

  htonl(), htons(), ntohs().

 

 

5.1.15 ntohs()

 

简述:

 

  将一个无符号短整形数从网络字节顺序转换为主机字节顺序。

 

  #include <winsock.h>

 

  u_short PASCAL FAR ntohs( u_short netshort);

 

  netshort:一个以网络字节顺序表达的16位数。

 

注释:

 

  本函数将一个16位数由网络字节顺序转换为主机字节顺序。

 

返回值:

 

  ntohs()返回一个以主机字节顺序表达的数。

 

参见:

 

  htonl(), htons(), ntohl().

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:186778次
    • 积分:2272
    • 等级:
    • 排名:第16438名
    • 原创:32篇
    • 转载:74篇
    • 译文:0篇
    • 评论:15条
    最新评论
    名家专栏