本人第一次编网络程序,并且也看过人家一些Sample ,但下手一个小时后未果,快晕了。
是这样的,我先写了个dialog base ,接着改写了ok 开关函数如下:
void CMyserverDlg::OnOK() 
{
CSocket Listen;
int port=1333;
if (!Listen.Create(port))
{
AfxMessageBox("Socket Send Create failed!");
CDialog::OnOK();
}
if (!Listen.Listen(5))
{
AfxMessageBox("Socket Send Create failed!");
CDialog::OnOK();
}

}
理论上我按下ok 后系统应该会响应并分配一个"1333"端口监听的。
但我用dos-line: 的netstat -a  看却没有1333这个端口在使用。
那到底那里出错了?

解决方案 »

  1.   

    CSocket用法不太对,你好好看看文档,2003 vc.net,有很多中文说明
      

  2.   

    但问题是我看了人家两个项目的原码却看不到有 bind() 出现。
    两分原码都的服务端都是先 AfxSocketInit() ,Create() ,Listen().....
               客户端都是先 AfxSocketInit() ,Create() ,Connect()......
    那么关于MFC里的资料:
    Create() // Call the Create member function after constructing a socket object to create the Windows socket and attach it.Bind()  //Call this member function to associate a local address with the socket.
    所以我就不知道MFC里的 Bind() 到底有什么用?
      

  3.   

    为什么还没有人能答?
    经过我20 多个小时的努力,终于有点成绩了,
    我调用了Getlasterror() 得到的返回是 WSAEADDRINUSE, MSDN里说这意思是
    “地址已在使用中”
      

  4.   

    你可以这样来实现
    先派生一个基类为CSocket的类:CListeningSocket
    在CMyDlg(CDialog的派生类)类中声明一个protect变量 :
    CListeningSocket *m_plistensocket;
    然后在OnOk()中添加如下代码:
    //因为基类为CSocket所以不必调用:bind函数,因为在调用create的时候自动将ip地址和端口与m_plistensocket绑定。
              m_plistensocket=new CListeningSocket();
    //m_mport (端口)为int型。m_mipaddress(ip地址)为CString型
    if(this->m_plistensocket->Create(m_mport,SOCK_STREAM,m_mipaddress.GetBuffer(0)))
    {
    if(m_plistensocket->Listen(5))
    {
    // MessageBox("listening right!");
    }else
    {
    MessageBox("listening error");
    };
    };
      

  5.   

    对了你说的bind()函数有什么用?
    如果你的网络通信使用api写的 一定要在create之后调用bind(),来将ip与你的socket绑定
    如果你用的是mfc,用的是:CSocket或是CAsyncSocket就不用bind()了因为在调用create的时候自动将ip地址和端口与m_plistensocket绑定。(CListeningSocket *m_plistensocket;)
      

  6.   

    噢。原来这样。我也是用MFC的。
    是了,现在我把这个程序改为多线程的(两个线程,其中一个是监听的)。
    为什么我这样做?原因是我觉得如果一个服务端程序要是在监听的话,那么它必然会向系统申请一个端口(我在程序中指定的)用于监听。如果用你的方法的话,我用netstat -a 就看不到有我指定的端口在进行监听,但现在我做到了,具体代码如下:
    UINT _ListenTcpThread(LPVOID lparam)
    {
    mydlg *pDlg=(mydlg *)lparam; CSocket sockSrvr;
    int createSucceed=sockSrvr.Create(2222);
    if(createSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Create错误!");
    return -1;
    }

    while(1)
    {
    int listenSucceed=sockSrvr.Listen(); //开始监听
    if (listenSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Listen错误!"+pDlg->GetError(GetLastError()));
            return -1;
    }


    }
        

    sockSrvr.Close();
    pThreadListen=::AfxBeginThread(_ListenTcpThread,pDlg);
    return 0;
    }
    如果这样做的话,在netstat -a  确实是有我在监听的端口,但它很吃资源,几乎用完了我的系统资源。
    还有,我看了人家的代码,却没有这个情况发生,原因是不会象我这样While(1)的 。
    所以这里又有一个问题,那就是人家的代码保持哪个监听端口为什么不用While(1)的?那靠什么支持呢?
      

  7.   

    噢。原来这样。我也是用MFC的。
    是了,现在我把这个程序改为多线程的(两个线程,其中一个是监听的)。
    为什么我这样做?原因是我觉得如果一个服务端程序要是在监听的话,那么它必然会向系统申请一个端口(我在程序中指定的)用于监听。如果用你的方法的话,我用netstat -a 就看不到有我指定的端口在进行监听,但现在我做到了,具体代码如下:
    UINT _ListenTcpThread(LPVOID lparam)
    {
    mydlg *pDlg=(mydlg *)lparam; CSocket sockSrvr;
    int createSucceed=sockSrvr.Create(2222);
    if(createSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Create错误!");
    return -1;
    }

    while(1)
    {
    int listenSucceed=sockSrvr.Listen(); //开始监听
    if (listenSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Listen错误!"+pDlg->GetError(GetLastError()));
            return -1;
    }


    }
        

    sockSrvr.Close();
    pThreadListen=::AfxBeginThread(_ListenTcpThread,pDlg);
    return 0;
    }
    如果这样做的话,在netstat -a  确实是有我在监听的端口,但它很吃资源,几乎用完了我的系统资源。
    还有,我看了人家的代码,却没有这个情况发生,原因是不会象我这样While(1)的 。
    所以这里又有一个问题,那就是人家的代码保持哪个监听端口为什么不用While(1)的?那靠什么支持呢?
      

  8.   

    while(1)
    {
    int listenSucceed=sockSrvr.Listen(); //开始监听
    if (listenSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Listen错误!"+pDlg->GetError(GetLastError()));
            return -1;
    }


    }
    中的
    int listenSucceed=sockSrvr.Listen(); //开始监听
    只要一调用Listen()函数 就会处于监听的状态,根本不用while,如果用了的话,你的这个线成就会一直执行的肯定要好你的电脑很大的资源其实你根本不用为这个担心的 因为mfc已经把你的所有的封装在了CSocket中了:当你调用了
    int listenSucceed=sockSrvr.Listen(); //开始监听
    if (listenSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Listen错误!"+pDlg->GetError(GetLastError()));
            return -1;
    }
    之后,你要做的只是要重载OnConnect(),OnAccept(),OnReceive()函数就可以了
    当有一个客户连接的时候,你的服务端会自动调用 OnConnect(),OnAccept(),当有客户端发送消息给服务器的时候。服务器也会自动调用OnReceive()函数,重载这些函数,在其中添加你的相应代码就可以了