?? 5-1.html
字號:
<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 <winsock.h></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 <winsock.h></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">	u_short sa_family;</P>
<P ALIGN="JUSTIFY">	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">	sin.sin_port=htons(alport);</P>
<P ALIGN="JUSTIFY">	if (bind(s,(LPSOCKADDR)&sin, sizeof(sin))=0) {</P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -