📄 5-1.html
字号:
<P ALIGN="JUSTIFY">		/* it worked */</P>
<P ALIGN="JUSTIFY">	}</P>
<P ALIGN="JUSTIFY">	if (GetLastError()!=WSAEADDRINUSE) {</P>
<P ALIGN="JUSTIFY">		/* fail */</P>
<P ALIGN="JUSTIFY">	}</P>
<P ALIGN="JUSTIFY">	alport-;</P>
<P ALIGN="JUSTIFY">	if (alport=IPPORT_RESERVED/2) {</P>
<P ALIGN="JUSTIFY">		/* fail</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>-</FONT><FONT SIZE=3>all unassigned reserved ports are */</P>
<P ALIGN="JUSTIFY">		/* in use. */</P>
<P ALIGN="JUSTIFY">	}</P>
<P ALIGN="JUSTIFY"> }</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> </P>
</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>如无错误发生,则</FONT><FONT SIZE=3>bind()</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>SOCKET_ERROR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,应用程序可通过</FONT><FONT SIZE=3>WSAGetLastError()</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"> WSAEADDRINUSE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:所定端口已在使用中(参见</FONT><FONT SIZE=3>setoption()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>SO_REUSEADDR</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>namelen</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>参数太小(小于</FONT><FONT SIZE=3>sockaddr</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"> WSAEAFNOSUPPORT</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>:该套接口已与一个地址捆绑。</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>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">参见:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"> connect(), listen(), getsockname(), setsockopt(), socket(), WSACancelBlockingCall().</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626833"><A NAME="_Toc336792916"><A NAME="_Toc336793392"></FONT><FONT SIZE=5>5.1.3 closesocket()</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 closesocket( SOCKET s);</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY"> s</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>WSAENOTSOCK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误返回。若本次为对套接口的最后一次访问,则相应的名字信息及数据队列都将被释放。</FONT><FONT SIZE=3>closesocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的语义受</FONT><FONT SIZE=3>SO_LINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与</FONT><FONT SIZE=3>SO_DONTLINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>选项影响,对比如下:</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">选项</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>间隔</FONT><FONT SIZE=3> </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">SO_DONTLINGER </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不关心</FONT><FONT SIZE=3> </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">SO_LINGER </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>零</FONT><FONT SIZE=3> </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">SO_LINGER </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>非零</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>优雅</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是</P>
<P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>若设置了</FONT><FONT SIZE=3>SO_LINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(亦即</FONT><FONT SIZE=3>linger</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构中的</FONT><FONT SIZE=3>l_onoff</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>域设为非零,参见</FONT><FONT SIZE=3>2.4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>4.1.7</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>4.1.21</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>各节),并设置了零超时间隔,则</FONT><FONT SIZE=3>closesocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的</FONT><FONT SIZE=3>recv()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用将以</FONT><FONT SIZE=3>WSAECONNRESET</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>SO_LINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>并确定了非零的超时间隔,则</FONT><FONT SIZE=3>closesocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且</FONT><FONT SIZE=3>SO_LINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设为非零超时,则</FONT><FONT SIZE=3>closesocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用将以</FONT><FONT SIZE=3>WSAEWOULDBLOCK</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>SO_DONTLINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(也就是说将</FONT><FONT SIZE=3>linger</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的</FONT><FONT SIZE=3>l_onoff</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>域设为零;参见</FONT><FONT SIZE=3>2.4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>4.1.7</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>4.1.21</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>节),则</FONT><FONT SIZE=3>closesocket()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下</FONT><FONT SIZE=3>WINDOWS</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>closesocket()</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>SOCKET_ERROR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误,应用程序可通过</FONT><FONT SIZE=3>WSAGetLastError()</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"> WSAENOTSOCK</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"> 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"> WSAEWOULDBLOCK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:该套接口设置为非阻塞方式且</FONT><FONT SIZE=3>SO_LINGER</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设置为非零超时间隔。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">参见:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"> accept(), socket(), ioctlsocket(), setsockopt(), WSAAsyncSelect().</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626834"><A NAME="_Toc336792917"><A NAME="_Toc336793393"></FONT><FONT SIZE=5>5.1.4 connect()</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 connect( 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>:欲进行连接的端口名。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"> namelen</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>connect()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将返回</FONT><FONT SIZE=3>WSAEADDRNOTAVAIL</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>SOCK_STREAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型),利用名字来与一个远程主机建立连接,一旦套接口调用成功返回,它就能收发数据了。对于数据报类套接口(</FONT><FONT SIZE=3>SOCK_DGRAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型),则设置成一个缺省的目的地址,并用它来进行后续的</FONT><FONT SIZE=3>send()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与</FONT><FONT SIZE=3>recv()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>调用。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">返回值:</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -