BOOL CServerDlg::InitNetwork()
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,1), &wsaData) != 0)
{
WSACleanup();
AfxMessageBox("初始化网络协议失败!");
return FALSE;
}

ServerSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSocket == INVALID_SOCKET)
{
closesocket(ServerSocket);
WSACleanup();
AfxMessageBox("创建套接字失败!");
return FALSE;
}
    
sockaddr_in localAddr;
//memset((void*)&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(8888);
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
WSAStartup(MAKEWORD(2,1), &wsaData);
if(bind(ServerSocket, (struct sockaddr*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
{
//就在这里绑定不起,错误代码为10049
closesocket(ServerSocket);
WSACleanup();
AfxMessageBox("绑定地址失败!");
return FALSE;
} if(WSAAsyncSelect(ServerSocket, m_hWnd, NETWORK_EVENT, FD_ACCEPT|FD_READ|FD_CLOSE)
   == SOCKET_ERROR)
{
closesocket(ServerSocket);
WSACleanup();
AfxMessageBox("注册网络异步事件失败!");
return FALSE;
} if(listen(ServerSocket, 5) == SOCKET_ERROR)
{
closesocket(ServerSocket);
AfxMessageBox("设置监听失败!");
WSACleanup();
return FALSE;
} return TRUE;
}

解决方案 »

  1.   

    if(WSAStartup(MAKEWORD(2,1), &wsaData) != 0)
    {
        WSACleanup();
        AfxMessageBox("初始化网络协议失败!");
        return FALSE;
    }
    改称
    if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
    {
        WSACleanup();
        AfxMessageBox("初始化网络协议失败!");
        return FALSE;
    }ServerSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    改称ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//memset((void*)&localAddr, 0, sizeof(localAddr));
    去掉注释,并改成 memset(&localAddr, 0, sizeof(localAddr));把bind前边一行的 WSAStartup(MAKEWORD(2,1), &wsaData);注释掉在试一下
      

  2.   

    不好意思
    bind前边一行的WSAStartup(MAKEWORD(2,1), &wsaData);本来是没有的如果我把防火墙关了,就可以运行
    现在是我如何穿透防火墙
      

  3.   

    源代码是这样的
    BOOL CServerDlg::InitNetwork()
    {
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,1), &wsaData) != 0)
    {
    WSACleanup();
    AfxMessageBox("初始化网络协议失败!");
    return FALSE;
    }ServerSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(ServerSocket == INVALID_SOCKET)
    {
    closesocket(ServerSocket);
    WSACleanup();
    AfxMessageBox("创建套接字失败!");
    return FALSE;
    }
        
    sockaddr_in localAddr;
    //memset((void*)&localAddr, 0, sizeof(localAddr));
    localAddr.sin_family = AF_INET;
    localAddr.sin_port = htons(8888);
    localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(ServerSocket, (struct sockaddr*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
    {
    //就在这里绑定不起,错误代码为10049
    closesocket(ServerSocket);
    WSACleanup();
    AfxMessageBox("绑定地址失败!");
    return FALSE;
    }if(WSAAsyncSelect(ServerSocket, m_hWnd, NETWORK_EVENT, FD_ACCEPT|FD_READ|FD_CLOSE)
       == SOCKET_ERROR)
    {
    closesocket(ServerSocket);
    WSACleanup();
    AfxMessageBox("注册网络异步事件失败!");
    return FALSE;
    }if(listen(ServerSocket, 5) == SOCKET_ERROR)
    {
    closesocket(ServerSocket);
    AfxMessageBox("设置监听失败!");
    WSACleanup();
    return FALSE;
    }return TRUE;
    }当我防火墙开起的时候就bind不起error 10049
    而防火墙关了就能正常绑定
    我看别人的程序开不开防火墙都能运行啊
      

  4.   

    不啊,别人的socket API程序在我机子上防火墙开起的时候就能运行啊,但我始终看不出别人的程序和我的程序有哪点不同
    好象都是WSAStartup
            socket
            bind
            listen
            ...
      

  5.   

    #if(WSAStartup(MAKEWORD(2,1), &wsaData) != 0)
    {
        WSACleanup();
        AfxMessageBox("初始化网络协议失败!");
        return FALSE;
    }
    改称
    if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
    {
        AfxMessageBox("初始化网络协议失败!");
        return FALSE;
    }#ServerSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    改称ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);#//memset((void*)&localAddr, 0, sizeof(localAddr));
    去掉注释,并改成 memset(&localAddr, 0, sizeof(localAddr));#在bind前边加上2行
    const int on = 1;
    setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));#去掉所有对WSACleanup();的调用
      

  6.   

    我知道原因了,防火墙把这个应用程序禁止了
    我记得昨天刚运行的时候防火墙是提示了一下
    谢谢anjuta_c的参与