⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5-1.html

📁 WinSock编程规范及应用
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第五章 套接口库函数参考</TITLE>
</HEAD>
<BODY>

<B><FONT FACE="宋体" LANG="ZH-CN" SIZE=6><P><A NAME="_Toc336626829"><A NAME="_Toc336792912"><A NAME="_Toc336793388">第五章</FONT><FONT SIZE=6> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=6>套接口库函数参考</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626830"><A NAME="_Toc336792913"><A NAME="_Toc336793389"></FONT><FONT FACE="Arial" SIZE=5>5.1 Windows Socket 1.1</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>库函数参考</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本章以字母顺序列出了套接口库函数,并介绍了技术细节。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用任一库函数时应在程序中包含</FONT><FONT SIZE=3>WINSOCK.H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>头文件。在附录</FONT><FONT SIZE=3>A.2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中还列出了一些与</FONT><FONT SIZE=3>BERKELEY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>兼容的头文件。这些头文件只起到兼容性的作用,它们都包含了</FONT><FONT SIZE=3>WINSOCK.H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>头文件,</FONT><FONT SIZE=3>WINDOWS.H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>头文件也是必需的,但</FONT><FONT SIZE=3>WINSOCK.H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>会视需要包含这一头文件。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626831"><A NAME="_Toc336792914"><A NAME="_Toc336793390"></FONT><FONT SIZE=5>5.1.1 accept()</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">简述:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在一个套接口接受一个连接。</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  #include &lt;winsock.h&gt;</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">  SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,</P>
<P ALIGN="JUSTIFY">  int FAR* addrlen);</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">  s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:套接口描述字,该套接口在</FONT><FONT SIZE=3>listen()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>后监听连接。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。</FONT><FONT SIZE=3>Addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数的实际格式由套接口创建时所产生的地址族确定。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  addrlen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:(可选)指针,指向存有</FONT><FONT SIZE=3>addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址长度的整形数。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">注释:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本函数从</FONT><FONT SIZE=3>s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的等待连接队列中抽取第一个连接,创建一个与</FONT><FONT SIZE=3>s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为非阻塞方式,则</FONT><FONT SIZE=3>accept()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>阻塞调用进程直至新的连接出现。如果套接口为非阻塞方式且队列中等待连接,则</FONT><FONT SIZE=3>accept()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口仍保持开放。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数为一个返回参数,其中填写的是为通讯层所知的连接实体地址。</FONT><FONT SIZE=3>addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数的实际格式由通讯时产生的地址族确定。</FONT><FONT SIZE=3>addrlen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数也是一个返回参数,在调用时初始化为</FONT><FONT SIZE=3>addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所指的地址空间;在调用结束时它包含了实际返回的地址的长度(用字节数表示)。该函数与</FONT><FONT SIZE=3>SOCK_STREAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的面向连接的套接口一起使用。如果</FONT><FONT SIZE=3>addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与</FONT><FONT SIZE=3>addrlen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中有一个为零</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,将不返回所接受的套接口远程地址的任何信息。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">返回值:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果没有错误产生,则</FONT><FONT SIZE=3>accept()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>返回一个描述所接受包的</FONT><FONT SIZE=3>SOCKET</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的值。否则的话,返回</FONT><FONT SIZE=3>INVALID_SOCKET</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误,应用程序可通过调用</FONT><FONT SIZE=3>WSAGetLastError()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获得特定的错误代码。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  addrlen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所指的整形数初始时包含</FONT><FONT SIZE=3>addr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所指地址空间的大小,在返回时它包含实际返回地址的字节长度。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">错误代码:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSANOTINITIALISED</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:在使用此</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之前应首先成功地调用</FONT><FONT SIZE=3>WSAStartup()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAENETDOWN</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口实现检测到网络子系统失效。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEFAULT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT><FONT SIZE=3>addrlen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数太小(小于</FONT><FONT SIZE=3>socket</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的大小)。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEINTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:通过一个</FONT><FONT SIZE=3>WSACancelBlockingCall()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来取消一个(阻塞的)调用。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEINPROGRESS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:一个阻塞的</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口调用正在运行中。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEINVAL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:在</FONT><FONT SIZE=3>accept()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>前未激活</FONT><FONT SIZE=3>listen()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEMFILE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:调用</FONT><FONT SIZE=3>accept()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时队列为空,无可用的描述字。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAENOBUFS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:无可用缓冲区空间。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAENOTSOCK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:描述字不是一个套接口。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEOPNOTSUPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:该套接口类型不支持面向连接服务。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  WSAEWOULDBLOCK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:该套接口为非阻塞方式且无连接可供接受。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">参见:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  bind(), connect(), listen(), select(), socket(), WSAAsyncSelect().</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626832"><A NAME="_Toc336792915"><A NAME="_Toc336793391"></FONT><FONT SIZE=5>5.1.2 bind()</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">简述:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将一本地地址与一套接口捆绑。</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  #include &lt;winsock.h&gt;</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">  int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR* name,</P>
<P ALIGN="JUSTIFY">  int namelen);</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">  s</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:标识一未捆绑套接口的描述字。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:赋予套接口的地址。</FONT><FONT SIZE=3>sockaddr</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构定义如下:</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  struct sockaddr{</P>
<P ALIGN="JUSTIFY">&#9;u_short sa_family;</P>
<P ALIGN="JUSTIFY">&#9;char sa_data[14];</P>
<P ALIGN="JUSTIFY">  };</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">  namelen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT><FONT SIZE=3>name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>名字的长度。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">注释:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本函数适用于未连接的数据报或流类套接口,在</FONT><FONT SIZE=3>connect()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>listen()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用前使用。当用</FONT><FONT SIZE=3>socket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。</FONT><FONT SIZE=3>bind()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>断口号)。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>Internet</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址族中,一个名字包括几个组成部分,对于</FONT><FONT SIZE=3>SOCK_PGRAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>SOCK_STREAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类套接口,名字由三部分组成:主机地址,协议号(显式设置为</FONT><FONT SIZE=3>UDP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>TCP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)和用以区分应用的端口号。如果一个应用并不关心分配给它的地址,则可将</FONT><FONT SIZE=3>Internet</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址设置为</FONT><FONT SIZE=3>INADDR_ANY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,或将端口号置为</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。如果</FONT><FONT SIZE=3>Internet</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址段为</FONT><FONT SIZE=3>INADDR_ANY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,则可使用任意网络接口;在有多种主机环境下可简化编程。如果端口号置为</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,则</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>套接口实现将给应用程序分配一个值在</FONT><FONT SIZE=3>1024</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>到</FONT><FONT SIZE=3>5000</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之间的唯一的端口。应用程序可在</FONT><FONT SIZE=3>bind()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>后用</FONT><FONT SIZE=3>getsockname()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来获知所分配的地址,但必需注意的是,</FONT><FONT SIZE=3>getsockname()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>只有在套接口连接成功后才会填写</FONT><FONT SIZE=3>Internet</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址,这是由于在多种主机环境下若干种</FONT><FONT SIZE=3>Internet</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>地址都是有效的。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如果一个应用程序需要把端口捆绑到超过</FONT><FONT SIZE=3>1024</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>-</FONT><FONT SIZE=3>5000</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>范围的特定端口时,比如</FONT><FONT SIZE=3>rsh</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>需要捆绑到任一保留端口,则可如下编程:</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">  SOCKADDR_IN sin;</P>
<P ALIGN="JUSTIFY">  SOCKET s;</P>
<P ALIGN="JUSTIFY">  u_short alport=IPPORT_RESERVED;</P>
<P ALIGN="JUSTIFY">  sin.sin_family=AF_INET;</P>
<P ALIGN="JUSTIFY">  sin.sin_addr.s_addr=0;</P>
<P ALIGN="JUSTIFY">  for (;;) {</P>
<P ALIGN="JUSTIFY">&#9;sin.sin_port=htons(alport);</P>
<P ALIGN="JUSTIFY">&#9;if (bind(s,(LPSOCKADDR)&amp;sin, sizeof(sin))=0) {</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -