公司上网用无线网卡,网卡ip为192.168.1.2
在家上网用有线网卡,网卡ip为192.168.2.2
一个socket程序,客户端,
在公司测试,设置服务端ip为192.168.1.0,没报错,
到家,运行后报错,如下图
经过一番折腾后发现,如果将 ip 192.168.X.0 的 X 设置的和本机使用中网卡的ip一个网段,就没事;
这个错误还真的没思路去解决
在家上网用有线网卡,网卡ip为192.168.2.2
一个socket程序,客户端,
在公司测试,设置服务端ip为192.168.1.0,没报错,
到家,运行后报错,如下图
经过一番折腾后发现,如果将 ip 192.168.X.0 的 X 设置的和本机使用中网卡的ip一个网段,就没事;
这个错误还真的没思路去解决
{
if (wParam == 0 && lParam == 0)
return; // Has the socket be closed?
CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE); // If yes ignore message
if (pSocket != NULL)
return; pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, FALSE);
if (pSocket == NULL)
{
// Must be in the middle of an Accept call
pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);
ASSERT(pSocket != NULL);// 574在这里
if(pSocket == NULL)
return;
pSocket->m_hSocket = (SOCKET)wParam;
CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FALSE);
} int nErrorCode = WSAGETSELECTERROR(lParam);
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
fd_set fds;
int nReady;
timeval timeout; timeout.tv_sec = 0;
timeout.tv_usec = 0; FD_ZERO(&fds);
FD_SET(pSocket->m_hSocket, &fds);
nReady = select(0, &fds, NULL, NULL, &timeout);
if (nReady == SOCKET_ERROR)
nErrorCode = WSAGetLastError();
if ((nReady == 1) || (nErrorCode != 0))
pSocket->OnReceive(nErrorCode);
}
break;
case FD_WRITE:
pSocket->OnSend(nErrorCode);
break;
case FD_OOB:
pSocket->OnOutOfBandData(nErrorCode);
break;
case FD_ACCEPT:
pSocket->OnAccept(nErrorCode);
break;
case FD_CONNECT:
pSocket->OnConnect(nErrorCode);
break;
case FD_CLOSE:
pSocket->OnClose(nErrorCode);
break;
}
}现在公司,用的是192.168.1.2的ip上网,刚试了下,程序内设置的ip 192.168.1.1也同样会报错
{
BOOL bError = FALSE;
int nError = 0;
CString sIP; bError = pSocket->Create(uPort);
if (bError == FALSE)
{
nError = ::GetLastError();
//TRACE("Create() Error:%d\r\n", nError);
pSocket->Close();
return FALSE;
} bError = pSocket->Listen();
if (bError == FALSE)
{
nError = ::GetLastError();
//TRACE("AsyncSelect() Error:%d\r\n", nError);
pSocket->Close();
return FALSE;
} return TRUE;}
BOOL C***::CreateTCPClient(ClientSocket* pSocket, const CString& sIP, const UINT& uPort)
{
BOOL bError = FALSE;
int nError = 0; bError = pSocket->Create();
if (bError == FALSE)
{
nError = ::GetLastError();
//TRACE("Create() Error:%d\r\n", nError);
pSocket->Close();
return FALSE;
} bError = pSocket->AsyncSelect();
if (bError == FALSE)
{
nError = ::GetLastError();
//TRACE("AsyncSelect() Error:%d\r\n", nError);
pSocket->Close();
return FALSE;
}
bError = pSocket->Connect((LPCTSTR)sIP, uPort);
if (bError == FALSE)
{
nError = ::GetLastError();
// 如果是返回值为10035的话,代表该SOCKET不能立即返回,
// 你应该在OnConnect中响应是否连接成功的消息。
// 这不是连接不成功的问题。
//TRACE("Connect() Error:%d\r\n", nError);
if (nError != WSAEWOULDBLOCK)
{
//TRACE("Connect() Error:%d\r\n", nError);
pSocket->Close();
return FALSE;
}
} return TRUE;
}
ASSERT(pSocket != NULL);// 574在这里
if(pSocket == NULL)
return;这位仁兄你的这两句话表达的都是一个意思是吧?
你试试吧assert注释掉,看看是否在if(pSocket == NULL)这里出错,如果是,那么就要看看你pSocket定义中这个pSocket的值是什么,你大可以把判断pSocket是否为NULL的语句都注释掉,然后运行程序,看看第一次这个pSocket是否得到了值.
我怀疑可能你这个陷入了某种死循环,一直在判断pSocket是否为NULL,而且没有超时机制,很有可能是这原因..