因为双方的IP都是已知的,为什么当客户端运行程序的时候,当执行到if(connect(ServerSocket,(LPSOCKADDR)&sockStruct,sizeof(sockStruct)) == SOCKET_ERROR)
时就不行了,连接就失败了,为什么?(双端都是AD上网的)客户端连接如下:
void CClientTestDlg::OnOK() 
{//连接
LPCTSTR ip; CGetIP di;
//di.ipstr = _T("127.0.0.1");
di.ipstr = _T("61.149.118.110"); if(di.DoModal() == IDOK)
{
if(di.ipstr.IsEmpty())
{
MessageBox("没有输入IP地址。","请输入IP地址",NULL);
return;
}
else
ip = di.ipstr;
}
else
return;    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL

         list.InsertString(0,"Winsock无法初始化!");
         WSACleanup();
         return;
} list.InsertString(0,"服务器开始创建SOCKET。"); ServerSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信    if(ServerSocket == INVALID_SOCKET)
{
         list.InsertString(0,"无法创建服务器socket!");
         return;
}    list.InsertString(0,"服务器端口:8001."); DWORD dwip;
if((dwip=inet_addr(ip))==INADDR_NONE)
{
list.InsertString(0,"IP赋值错误");
return;
}
    sockStruct.sin_family=AF_INET; //使用TCP/IP协议
    sockStruct.sin_port = htons(8001);
sockStruct.sin_addr.S_un.S_addr = dwip; if(connect(ServerSocket,(LPSOCKADDR)&sockStruct,sizeof(sockStruct)) == SOCKET_ERROR)
    {
    list.InsertString(0,"无法连接服务器。");
list.InsertString(0,"");
        return;
}
else
{
char *buf = new char[100];
strcpy(buf,"工作站连接成功。——发往服务器的消息。");
send(ServerSocket,buf,100,0);
delete buf;
} WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_READCOLOSE,FD_READ|FD_CLOSE);
         // 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息  list.InsertString(0,"连接服务器成功。");
list.InsertString(0,"IP地址:"+di.ipstr);
IsTrue = TRUE;
    return;
}
LRESULT CClientTestDlg::OnReadClose(WPARAM wParam,LPARAM lParam)
{
char *buf = new char[100];
CString str;
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
if(recv(ServerSocket,(char *)&msg,sizeof(msg),0) == SOCKET_ERROR)
{
list.InsertString(0,"接收数据发生错误。");
return 0L;
}
str.Format("%s",msg.msg);
list.InsertString(0,str);
break;
case FD_CLOSE:
closesocket(ServerSocket);
list.InsertString(0,"服务器退出。");
IsTrue = FALSE;
break;
}
return 0L;
}服务端监听如下:
void CPublicNetSoftDlg::OnOK() 
{//初始化与绑定服务器
    WSADATA wsaData;
    int iErrorCode;
    if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL

         list.InsertString(0,"Winsock无法初始化!");
         WSACleanup();
         return;
} list.InsertString(0,"服务器开始创建SOCKET。"); ServerSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信    if(ServerSocket == INVALID_SOCKET)
{
         list.InsertString(0,"无法创建服务器socket!");
         return;
}    m_sockServerAddr.sin_family = AF_INET;
    m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;   //向所有的IP地址发送消息
    m_sockServerAddr.sin_port = htons(8001);    if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
    {
    list.InsertString(0,"无法绑定服务器。");
        return;
}    list.InsertString(0,"服务器端口:8001.");    iErrorCode=WSAAsyncSelect(ServerSocket,m_hWnd,WM_CLIENT_ACCEPT,FD_ACCEPT);
         // 产生相应传递给窗口的消息为WM_SERVER_ACCEPT ,这是自定义消息    if (iErrorCode == SOCKET_ERROR) 
{
         list.InsertString(0,"WSAAsyncSelect设定失败!——用于连接请求的消息");
         return;
}    if (listen(ServerSocket,1) == SOCKET_ERROR) //开始监听客户连接请求
{
list.InsertString(0,"服务器监听失败!");
        return;
} IsTrue = TRUE;  list.AddString("服务器绑定监听成功。");
    return; 
}