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

📄 subject_19511.htm

📁 一些关于vc的问答
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<blockquote><p>
回复者:中国娃娃 回复日期:2002-10-29 17:09:33
<br>内容:最好把你这个CBlockSocket的声明和定义贴出来。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:hf 回复日期:2002-10-29 17:13:12
<br>内容:// blocksock.h<BR><BR>#define SECONDS_MIN&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // min seconds of timeout<BR>#define SECONDS_MAX&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// max seconds of timeout<BR>#define SECONDS_DEF&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// min seconds of timeout<BR><BR>typedef const struct sockaddr* LPCSOCKADDR;<BR><BR>// Class CBlockSocketExcption<BR>class CBlockSocketException : public CException<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_DYNAMIC(CBlockSocketException)<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;CBlockSocketException(char* pchMessage);<BR>&nbsp;&nbsp;&nbsp;&nbsp;~CBlockSocketException(){}<BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;int m_nError;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString m_strMessage;<BR>};<BR><BR>// Class CSockAddr<BR>class CSockAddr : public sockaddr_in <BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 缺省构造函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSockAddr()&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_family = AF_INET;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_port = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_addr.s_addr = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 拷贝构造函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSockAddr(const SOCKADDR& sa) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(this, &sa, sizeof(SOCKADDR)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 拷贝构造函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSockAddr(const SOCKADDR_IN& sin) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(this, &sin, sizeof(SOCKADDR_IN));<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 构造函数,主机字节顺序<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSockAddr(const ULONG ulAddr, const USHORT ushPort = 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_family = AF_INET;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_port = htons(ushPort);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_addr.s_addr = htonl(ulAddr);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 构造函数,主机字节顺序,ip地址是点分十进制格式<BR>&nbsp;&nbsp;&nbsp;&nbsp;CSockAddr(const char* pchIP, const USHORT ushPort = 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_family = AF_INET;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_port = htons(ushPort);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_addr.s_addr = inet_addr(pchIP);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 取点分十进制格式的ip地址<BR>&nbsp;&nbsp;&nbsp;&nbsp;char* DottedDecimal() <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(inet_ntoa(sin_addr));<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 取端口号<BR>&nbsp;&nbsp;&nbsp;&nbsp;USHORT Port() const&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ntohs(sin_port));<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 取ip地址<BR>&nbsp;&nbsp;&nbsp;&nbsp;ULONG IPAddr() const <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ntohl(sin_addr.s_addr));<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 重载运算符=<BR>&nbsp;&nbsp;&nbsp;&nbsp;const CSockAddr& operator=(const SOCKADDR& sa) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(this, &sa, sizeof(SOCKADDR));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return *this;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 重载运算符=<BR>&nbsp;&nbsp;&nbsp;&nbsp;const CSockAddr& operator=(const SOCKADDR_IN& sin) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(this, &sin, sizeof(SOCKADDR_IN));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return *this;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 运算符SOCKADDR<BR>&nbsp;&nbsp;&nbsp;&nbsp;operator SOCKADDR() <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return *((LPSOCKADDR) this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 运算符LPSOCKADDR<BR>&nbsp;&nbsp;&nbsp;&nbsp;operator LPSOCKADDR() <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (LPSOCKADDR) this;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 运算符LPSOCKADDR_IN<BR>&nbsp;&nbsp;&nbsp;&nbsp;operator LPSOCKADDR_IN() <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (LPSOCKADDR_IN) this;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>};<BR><BR>// Class CBlockSocket<BR>class CBlockSocket : public CObject <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_DYNAMIC(CBlockSocket)<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;//成员变量<BR>&nbsp;&nbsp;&nbsp;&nbsp;SOCKET m_hSocket;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 缺省构造函数,创建一个没有初始化的对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;CBlockSocket::CBlockSocket()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hSocket = NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 缺省析构函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;CBlockSocket::~CBlockSocket(){ }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 调用Winsock的socket函数,然后把m_hSocket设置为返回的32位SOCKET句柄<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Create(int nType = SOCK_STREAM);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 调用Winsock的closesocket函数,关闭一个已打开的SOCKET<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Close();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 如果SOCKET是打开的话,该函数关闭SOCKET,它不会陷入异常,可以在异常处理中调用该函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Cleanup();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;void Bind(LPCSOCKADDR psa);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Listen();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Connect(LPCSOCKADDR psa);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL Accept(CBlockSocket& sConnect, LPSOCKADDR psa);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 该TCP函数调用Winsock的select函数以激活超时处理之后,再调用Winsock的send函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 每个Send调用实际传送的字节数依赖于连接另一端接收程序接收字节的速度<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 如果另一端的接收程序在读完数据之前关闭SOCKET,Send将陷入异常<BR>&nbsp;&nbsp;&nbsp;&nbsp;int Send(const char* pch, const int nSize, int nSeconds = SECONDS_DEF);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 该TCP函数调用Winsock的select函数以激活超时处理之后,再调用Winsock的recv函数<BR>&nbsp;&nbsp;&nbsp;&nbsp;int Receive(char* pch, const int nSize, int nSeconds = SECONDS_DEF);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 该TCP函数连续调用Send函数,直到所有的字节都被发送出去或者接收端关闭SOCKET<BR>&nbsp;&nbsp;&nbsp;&nbsp;int Write(const char* pch, const int nSize, int nSeconds = SECONDS_DEF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 该TCP函数连续调用Receive函数,直到所有的字节都被接收到或者发送端关闭SOCKET<BR>&nbsp;&nbsp;&nbsp;&nbsp;int Read(char* pch, const int nSize, int nSeconds = SECONDS_DEF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int SendDatagram(const char* pch, const int nSize, LPCSOCKADDR psa, int nSeconds = SECONDS_DEF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int ReceiveDatagram(char *pch, const int nSize, LPSOCKADDR psa, int nSeconds = SECONDS_DEF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 得到连接另一端的SOCKET地址<BR>&nbsp;&nbsp;&nbsp;&nbsp;void GetPeerAddr(LPSOCKADDR psa);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 得到连接这一端的SOCKET地址<BR>&nbsp;&nbsp;&nbsp;&nbsp;void GetSockAddr(LPSOCKADDR psa);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;static CSockAddr GetHostByName(const char* pchName, const USHORT ushPort);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;static const char* GetHostByAddr(LPCSOCKADDR psa);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;operator SOCKET() <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return m_hSocket;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>};<BR><BR><BR>#include &lt;stdafx.h&gt;<BR>#include "BlockSocket.h"<BR><BR>//class CBlockSocketException<BR>IMPLEMENT_DYNAMIC(CBlockSocketException, CException)<BR><BR>CBlockSocketException::CBlockSocketException(char* pchMessage)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_strMessage = pchMessage;<BR>}<BR><BR>//class CBlockSocket<BR>IMPLEMENT_DYNAMIC(CBlockSocket, CObject)<BR><BR>void CBlockSocket::Cleanup()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (m_hSocket == NULL) return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(closesocket(m_hSocket) != SOCKET_ERROR);<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_hSocket = NULL;<BR>}<BR><BR>void CBlockSocket::Create(int nType)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket == NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if ((m_hSocket = socket(AF_INET, nType, 0)) == INVALID_SOCKET)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Create");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>void CBlockSocket::Bind(LPCSOCKADDR psa)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nReuseaddr = 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nIntSize = sizeof(int);<BR>&nbsp;&nbsp;&nbsp;&nbsp;setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&nReuseaddr, nIntSize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (bind(m_hSocket, psa, sizeof(SOCKADDR)) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Bind");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>void CBlockSocket::Listen()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (listen(m_hSocket, 5) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Listen");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>BOOL CBlockSocket::Accept(CBlockSocket& sConnect, LPSOCKADDR psa)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(sConnect.m_hSocket == NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nLengthAddr = sizeof(SOCKADDR);<BR>&nbsp;&nbsp;&nbsp;&nbsp;sConnect.m_hSocket = accept(m_hSocket, psa, &nLengthAddr);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (sConnect == INVALID_SOCKET)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (WSAGetLastError() != WSAEINTR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Accept");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>}<BR><BR>void CBlockSocket::Close()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (closesocket(m_hSocket) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Close");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_hSocket = NULL;<BR>}<BR><BR>void CBlockSocket::Connect(LPCSOCKADDR psa)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (connect(m_hSocket, psa, sizeof(SOCKADDR)) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Connect");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>int CBlockSocket::Send(const char* pch, const int nSize, int nSeconds)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nSize &gt; 0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nSeconds &lt; SECONDS_MIN) nSeconds = SECONDS_MIN;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nSeconds &gt; SECONDS_MAX) nSeconds = SECONDS_MAX;<BR>&nbsp;&nbsp;&nbsp;&nbsp;FD_SET fd = {1, m_hSocket};<BR>&nbsp;&nbsp;&nbsp;&nbsp;TIMEVAL tv = {nSeconds, 0};<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (select(0, NULL, &fd, NULL, &tv) == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Send timeout");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesSent = send(m_hSocket, pch, nSize, 0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nBytesSent == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Send");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return nBytesSent;<BR>}<BR><BR>int CBlockSocket::Receive(char* pch, const int nSize, int nSeconds)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nSize &gt; 0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nSeconds &lt; SECONDS_MIN) nSeconds = SECONDS_MIN;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nSeconds &gt; SECONDS_MAX) nSeconds = SECONDS_MAX;<BR>&nbsp;&nbsp;&nbsp;&nbsp;FD_SET fd = {1, m_hSocket};<BR>&nbsp;&nbsp;&nbsp;&nbsp;TIMEVAL tv = {nSeconds, 0};<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (select(0, &fd, NULL, NULL, &tv) == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Receive timeout");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesReceived = recv(m_hSocket, pch, nSize, 0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nBytesReceived == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Receive");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return nBytesReceived;<BR>}<BR><BR>int CBlockSocket::Write(const char* pch, const int nSize, int nSeconds)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nSize&gt;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesSent = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesThisTime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;const char* pch1 = pch;<BR>&nbsp;&nbsp;&nbsp;&nbsp;do{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nBytesThisTime = Send(pch1, nSize - nBytesSent, nSeconds);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nBytesThisTime &lt;= 0) break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nBytesSent += nBytesThisTime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pch1 += nBytesThisTime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}while(nBytesSent &lt; nSize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return nBytesSent;<BR>}<BR><BR>int CBlockSocket::Read(char* pch, const int nSize, int nSeconds)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nSize&gt;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesRead = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesThisTime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char* pch1 = pch;<BR>&nbsp;&nbsp;&nbsp;&nbsp;do{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nBytesThisTime = Receive(pch1, nSize - nBytesRead, nSeconds);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nBytesThisTime &lt;= 0) break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nBytesRead += nBytesThisTime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pch1 += nBytesThisTime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}while(nBytesRead &lt; nSize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return nBytesRead;<BR>}<BR><BR>int CBlockSocket::SendDatagram(const char* pch, const int nSize, LPCSOCKADDR psa, int nSeconds)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nSize&gt;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;FD_SET fd = {1, m_hSocket};<BR>&nbsp;&nbsp;&nbsp;&nbsp;TIMEVAL tv = {nSeconds, 0};<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (select(0, NULL, &fd, NULL, &tv) == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Send timeout");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesSent = sendto(m_hSocket, pch, nSize, 0, psa, sizeof(SOCKADDR));<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nBytesSent == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("SendDatagram");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return nBytesSent;<BR>}<BR><BR>int CBlockSocket::ReceiveDatagram(char *pch, const int nSize, LPSOCKADDR psa, int nSeconds)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nSize&gt;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;FD_SET fd = {1, m_hSocket};<BR>&nbsp;&nbsp;&nbsp;&nbsp;TIMEVAL tv = {nSeconds, 0};<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (select(0, &fd, NULL, NULL, &tv) == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("Receive timeout");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nFromSize = sizeof(SOCKADDR);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nBytesReceived = recvfrom(m_hSocket, pch, nSize, 0, psa, &nFromSize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (nBytesReceived == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("ReceiveDatagram");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return nBytesReceived;<BR>}<BR><BR>void CBlockSocket::GetPeerAddr(LPSOCKADDR psa)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nLengthAddr = sizeof(SOCKADDR);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (getpeername(m_hSocket, psa, &nLengthAddr) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("GetPeerAddr");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>void CBlockSocket::GetSockAddr(LPSOCKADDR psa)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hSocket != NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nLengthAddr = sizeof(SOCKADDR);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (getsockname(m_hSocket, psa, &nLengthAddr) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("GetSockAddr");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>CSockAddr CBlockSocket::GetHostByName(const char* pchName, const USHORT ushPort /* = 0 */)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;hostent* pHostEnt = gethostbyname(pchName);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (pHostEnt == NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("GetHostByName");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ULONG* pulAddr = (ULONG*) pHostEnt-&gt;h_addr_list[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN sockTemp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;sockTemp.sin_family = AF_INET;<BR>&nbsp;&nbsp;&nbsp;&nbsp;sockTemp.sin_port = htons(ushPort);<BR>&nbsp;&nbsp;&nbsp;&nbsp;sockTemp.sin_addr.s_addr = *pulAddr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return sockTemp;<BR>}<BR><BR>const char* CBlockSocket::GetHostByAddr(LPCSOCKADDR psa)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;hostent* pHostEnt = gethostbyaddr((char*)&((LPSOCKADDR_IN) psa)-&gt;sin_addr, 4, AF_INET);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(pHostEnt == NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CBlockSocketException("GetHostByAddr");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return pHostEnt-&gt;h_name;<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:hf 回复日期:2002-10-29 17:22:32
<br>内容:那就麻烦你帮我找找,看看问题出在哪,调试的时候,客户程序在接收完文件长度后接受文件数据时出现CBlockSocketException
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:中国娃娃 回复日期:2002-10-29 17:56:08
<br>内容:晕,差点被你害死!----我写了两个进程,但始终没办法连上。<BR><BR>看了半天连接部分。<BR><BR><BR>有两处可疑点:<BR>CSockAddr sbServer=CSockAddr("202.127.205.153",1020);<BR>try<BR>{<BR>CBlockSocket&nbsp;&nbsp;mysocket;<BR>mysocket.Create();<BR>mysocket.Connect(sbServer);<BR>CLHCDApp *app;<BR>app=(CLHCDApp *)AfxGetApp( ); <BR>char *DataBuf;<BR>char&nbsp;&nbsp;filelen[20];<BR>int uiFileLen;<BR>mysocket.Write(app-&gt;netfilename,60,10);<BR>int&nbsp;&nbsp;len;<BR>len=0;<BR>len=mysocket.Read(filelen,20,10);<BR>if (len==2)<BR>{<BR>&nbsp;&nbsp;::AfxMessageBox("服务器上数据文件不存在");<BR>}<BR>else<BR>{<BR>uiFileLen=atoi(filelen);//不能保证此时filelen一定是以0为结束符,因此有可能造成转换后的值是一个不正确的值<BR>mysocket.Read(DataBuf,uiFileLen,100);//DataBuf尚未分配内存<BR>。。。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:hf 回复日期:2002-10-29 18:05:57
<br>内容:非常感谢你的答案。问题确实出在DataBuf尚未分配内存,非常感谢<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:中国娃娃 回复日期:2002-10-29 18:08:04
<br>内容:不客气,相互学习吧,你的程序写的挺好的!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

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