不知哪位高手能给我一些相关源代码(关键部分);

解决方案 »

  1.   

    Server端:
    SOCKET m_hSocket;
    SOCKADDR_IN m_addr;void CSockServerDlg::OnOK() 
    {
    // TODO: Add extra validation here
    if(m_hSocket!=NULL)
    {
    ::closesocket(m_hSocket);
    m_hSocket = NULL;
    }
    if(m_hSocket==NULL)
    {
    m_hSocket = socket(AF_INET,SOCK_STREAM,0);
    ASSERT(m_hSocket!=NULL);
    } UpdateData();
    m_addr.sin_family = AF_INET;
    m_addr.sin_addr.S_un.S_addr = INADDR_ANY;
    m_addr.sin_port = htons(m_nPort); //bind 
    int ret=0;
    ret=::bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));
    if(ret == SOCKET_ERROR)
    {
    TRACE("Bind Error:%d\n",::WSAGetLastError());
    return;
    }

    //listen
    ret=::listen(m_hSocket,2);
    if(ret == SOCKET_ERROR)
    {
    TRACE("Listrn Error:%d\n",::WSAGetLastError());
    return;
    } // wait to accept
    SOCKET s=::accept(m_hSocket,NULL,NULL);
    if(ret == SOCKET_ERROR)
    {
    TRACE("Accept Error:%d\n",::WSAGetLastError());
    return;
    } //receive data by socket s
    char buff[256];
    ret=::recv(s,buff,256,0);
    if(ret == 0 || ret == SOCKET_ERROR ){
    TRACE("Recv data error: %d\n", WSAGetLastError());
    return ;
    } //get out the name and the password from the buff
    char* name = NULL;
    char* pass = NULL;
    int len1 = 0;
    int len2 = 0;
    len1 = buff[0];
    name = new char[len1+1];
    for(int i=0;i<len1;i++)
    {
    name[i] = buff[i+1];
    }
    name[len1] = '\0'; len2 = buff[len1+1];
    pass = new char[len2+1];
    for( i=0;i<len2;i++)
    {
    pass[i] = buff[i+len1+2];
    }
    pass[len2] = '\0'; CString str;
    if(::strcmp(name,"ware")!=0)
    {
    str = _T(" 用户名不正确");
    TRACE(_T("用户名不正确\n"));
    } else
    {
    if(::strcmp(pass,"11111")!=0)
    {
    str = _T(" 用户密码不正确");
    TRACE(_T("用户密码不正确\n"));
    }
    } if(str.IsEmpty())
    {
    str = "你的账户余额为20.355元";
    }
    char* buf=str.GetBuffer(0);
    ret = ::send(s,buf,str.GetLength(),0);
    if(ret != str.GetLength())
    {
    TRACE("Send data error: %d\n", WSAGetLastError());
    return ;
    } delete [] name;
    delete [] pass;

    }void CSockServerDlg::OnDestroy() 
    {
    CDialog::OnDestroy();

    // TODO: Add your message handler code here
    this->CleanUp();
    }void CSockServerDlg::StartUp()
    {
    WSADATA wsaData;
    WORD version=MAKEWORD(2,0);
    int ret = ::WSAStartup(version,&wsaData);
    if(ret!=0)
    TRACE("Initialize error!\n");
    }void CSockServerDlg::CleanUp()
    {
    if(::WSACleanup()!=0)
    TRACE("UnInitialize Error:%d\n",::WSAGetLastError());
    }
    Client端:
    SOCKET m_hSocket;
    SOCKADDR_IN m_addr;BOOL CSockClientDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    // TODO: Add extra initialization here
    this->StartUp();
    return TRUE;  // return TRUE  unless you set the focus to a control
    }void CSockClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }// If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.void CSockClientDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }// The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CSockClientDlg::OnQueryDragIcon()
    {
    return (HCURSOR) m_hIcon;
    }void CSockClientDlg::OnOK() 
    {
    // TODO: Add extra validation here
    //create socket and connect to server
    if(m_hSocket != NULL)
    {
    ::closesocket(m_hSocket);
    m_hSocket = NULL;
    }
    if(m_hSocket ==NULL)
    {
    m_hSocket = socket(AF_INET, SOCK_STREAM,0);
    ASSERT(m_hSocket != NULL);
    }
    UpdateData(); m_addr.sin_family = AF_INET;
    m_addr.sin_addr.S_un.S_addr = inet_addr(m_serverIP.GetBuffer(0));
    m_addr.sin_port = htons(m_nPort);

    int ret =0;
    int error=0;
    ret = ::connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));
    if(ret == SOCKET_ERROR)
    {
    TRACE("Connect Error:%d\n",::WSAGetLastError());
    if(error == 10061)
    AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!"));
    return ;
    } //send user name and passwor to the server 

    CString str;
    str += char(m_user.GetLength());
    str += m_user;
    str += char(m_passWord.GetLength());
    str += m_passWord; char* buf = str.GetBuffer(0);
    ret = ::send(m_hSocket,buf,str.GetLength(),0);
    if(ret != str.GetLength())
    {
    TRACE("Senddata Error:%d\n",::WSAGetLastError());
    return;
    } //wait to receive data from the server
    char buff[256];
    ret = ::recv(m_hSocket,buff,256,0);
    if(ret ==0 )
    {
    TRACE("receive data Error:%d\n",::WSAGetLastError());
    }
    buff[ret] = '\0';
    AfxMessageBox(buff);}void CSockClientDlg::OnDestroy() 
    {
    CDialog::OnDestroy();

    // TODO: Add your message handler code here
    if(m_hSocket != NULL){
    closesocket(m_hSocket);
    m_hSocket = NULL;
    }
    this->CleanUp();
    }void CSockClientDlg::StartUp()
    {
    WSADATA wsaData;
    DWORD version = MAKEWORD(2,0);
    int ret = ::WSAStartup(version,&wsaData);
    if(ret != 0)
    TRACE(_T("Initlize Error\n"));
    }void CSockClientDlg::CleanUp()
    {
    int ret = ::WSACleanup();
    if(ret != 0)
    {
    TRACE(_T("UnInitlize Error\n"));
    }
    }
      

  2.   

    http://cs.baylor.edu/~donahoo/practical/CSockets/mfc