//MFC编程
// 创建链接时,“绑定失败!!!”void CServerDlg::OnBnClickedStratserver()
{
// TODO: Add your control notification handler code here
char buf[10];
int bufLen = 10;
int idAddrLen;
WSADATA wsaData;
unsigned short m_usServerPort; this->GetDlgItem(IDC_STRATSERVER)->EnableWindow(true);
this->GetDlgItem(IDC_STOPSERVER)->EnableWindow(false); this->UpdateData(); if(WSAStartup(MAKEWORD(2,1), &wsaData) != 0)
{
this->MessageBox(_T("Could not load Windows Sockets DLL."), NULL, MB_OK);
return;
} m_usServerPort = htons(this->m_sPort); this->m_sockServerAddr.sin_family = AF_INET;
this->m_sockClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
this->m_sockServerAddr.sin_port = htons(m_usServerPort); this->m_hServerSocket = socket(AF_INET, SOCK_STREAM, 0);
if(this->m_hServerSocket == INVALID_SOCKET)
{
AfxMessageBox(_T("创建套接字失败!"));
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// bind
if(bind(this->m_hServerSocket, (LPSOCKADDR)&m_sockServerAddr, sizeof(m_sockServerAddr)) == SOCKET_ERROR)
{
AfxMessageBox(_T("绑定失败!!!"));
return;
} // listen
if(listen(this->m_hServerSocket, 1) == SOCKET_ERROR)
{
AfxMessageBox(_T("监听错误!!!"));
return;
} // accept
idAddrLen = sizeof(this->m_sockClientAddr);
this->m_hTempSocket = accept(this->m_hServerSocket, (struct sockaddr *)&m_sockClientAddr, &idAddrLen);
if(this->m_hTempSocket == INVALID_SOCKET)
{
AfxMessageBox(_T("读取错误!!!"));
return;
}
// Update Data.....
this->m_csIncomeMsg = buf;
this->UpdateData(false); if(closesocket(this->m_hTempSocket) == SOCKET_ERROR)
{
AfxMessageBox(_T("关闭连接错误!!!"));
return;
}
}

解决方案 »

  1.   

    用WSAGetLastError 看看返回的错误是啥
      

  2.   

    WSAGetLastError() 的值是10049,不知道什么意思啊。
      

  3.   

    通过WSAGetLastError()获取相应错误代码。
    相应错误代码如下:
      WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
      WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
      WSAEADDRINUSE:所定端口已在使用中(参见setoption()中的SO_REUSEADDR选项)。
      WSAEFAULT:namelen参数太小(小于sockaddr结构的大小)。
      WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
      WSAEAFNOSUPPORT:本协议不支持所指定的地址族。
      WSAEINVAL:该套接口已与一个地址捆绑。
      WSAENOBUFS:无足够可用缓冲区,连接过多。
      WSAENOTSOCK:描述字不是一个套接口。另外,Socket环境的初始化最好在程序初始化时调用一次即可。
      

  4.   

        m_usServerPort = htons(this->m_sPort);    this->m_sockServerAddr.sin_family = AF_INET;
        this->m_sockClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        this->m_sockServerAddr.sin_port = htons(m_usServerPort);端口被转了两次都分不清东西南北了吧
      

  5.   

    另外如果端口已经被绑定了一次除非Shutdown(Socket)/CloseSocket(socket)否则不能再次绑定
      

  6.   

    #define WSAEADDRNOTAVAIL                 10049L
    请求地址在其上下文中无效
    但是我实在没有看出来bind有什么问题...
      

  7.   

    我觉得你用的this实在是太多了
      

  8.   

    ps:.h文件中的一些定义…………private:
    SOCKADDR_IN m_sockServerAddr;
    SOCKADDR_IN m_sockClientAddr; // Socket address structure
    SOCKET m_hTempSocket;
        SOCKET m_hServerSocket;
    public:
    short m_sPort;
    CString m_csIncomeMsg;
    bool m_bServerControl;
    afx_msg void OnBnClickedStratserver();
    afx_msg void OnBnClickedCancel();
    afx_msg void OnBnClickedStopserver();