大虾们帮帮忙
服务器端nPort =34567;
int j = m_Listen.Create(nPort);
int i = m_Listen.Listen(3);
if( (i == 0)||(j ==0))
MessageBox("Listen error");int i = m_Listen.Accept(recSo);在客户端nPort =34567;
m_Connect.Create();
int i = m_Connect.Connect("192.168.166.216",nPort);
连接是成功的
服务器也可以给客户端发消息
为什么客户端不能给服务器发消息呢!
谢谢各位大虾了、!!!

解决方案 »

  1.   

    int i = m_Listen.Accept(recSo);
    应该是从i读取数据,不行先用WSAGetLastError()看看是什么原因。
      

  2.   

    楼上说的不对
    tcp连接一旦建立成功,跟是否有监听是没有关系的
    你说服务器可以给客户端发消息
    那么问题肯定是出在你客户端发送消息时使用了错误的socket从你给出的代码根本看不出问题
    你最好多贴点出来
    可以帮你找找错误 
      

  3.   

    C/S的基本模型都没有掌握,不发表评论了,随便找个将winsock编程的书看看先吧
      

  4.   

    http://www.eaoo.com/design/list.asp?classid=2&Nclassid=13
      

  5.   

    客户端的法消息代码
    谢谢各位大虾。
             int nBuf;
    int iSendMsgBytes;
    mMsgFlag = 0 ;
    m_SMessage.GetWindowText(strMessage);
    nBuf = strMessage.GetLength();
    iSendMsgBytes = m_Connect.Send(strMessage.GetBuffer(nBuf),nBuf);
    if( iSendMsgBytes==0 )
    MessageBox("send error");
      

  6.   

    那你的服务器那端有没有用receive呢
      

  7.   

    严格来说不是m_Listen这个对象收到数据,而是recSo对象收到数据。
    所以在recSo对象的类中需要实现OnReceive事件,在那里用receive方法收数据。
    你是这样做的么?
      

  8.   

    是啊
    在服务器端的OnReceive事件中: CString Message;
    char buff[100]={0};
    int nBuf = 100;
    int ret=0;
    ret=recSo.Receive(Message.GetBuffer(nBuf),nBuf)
    我但不跟踪,是客户端发信息没问题。
    就是接收不了程序执行到ret=recSo.Receive(Message.GetBuffer(nBuf),nBuf)就出错了。
    谢谢各位大虾!!
      

  9.   

    明白。是CString的问题。
    别用CString,直接用char*就可以了,就使用你上面定义的buff变量
      

  10.   

    是啊。我是改成了:
    CString Message;
    char buff[100]={0};
    int nBuf = 100;
    int ret=0;
    ret=recSo.Receive(buff,nBuf);
    Message=buff;
    也是不好用啊。还是到ret=recSo.Receive(buff,nBuf);
    就出错了。
      

  11.   

    在服务器端的OnReceive事件中 ?--> 应该在 recSo 的 OnReceive 中而不是 m_Listen 的 OnReceive 中。m_Listen 只负责监听客户端的连接,recSo 才是接收和发送数据的套接字。
      

  12.   

    void CSendDlg::OnButtonRecv() //客户端,发送消息
    {
    CSocket socket;
    socket.Create(7802);
    socket.Connect("127.0.0.1", 7801);
    char sBuf[32];
    lstrcpy(sBuf, "你好吗?");
    socket.Send(sBuf,32);
    socket.Close();
    }void CRecvDlg::OnButtonSend() //服务器端,接收消息
    {
    CSocket ls_socket;//侦听套接字
             CSocket co_socket;//连接套接字
    ls_socket.Create(7801, SOCK_STREAM);
    ls_socket.Listen(1);
    ls_socket.Accept(co_socket);
    char sBuf[32];
    co_socket.Receive(sBuf, 32);
             AfxMessageBox(sBuf,MB_OK);
    co_socket.Close();
    }
      

  13.   

    我是把 recSo 的 OnReceive 事件函数重载了。其中调用的是对话框的onreceive函数。
    所以每个套接字的OnReceive都会去调用对话框的onreceive函数。
    在这个函数里:
    CString Message;
    char buff[100]={0};
    int nBuf = 100;
    int ret=0;
    ret=recSo.Receive(buff,nBuf);
    Message=buff;
    我现在每执行到ret=recSo.Receive(buff,nBuf);
    就出错了。
      

  14.   

    你发送以后iSendMsgBytes = m_Connect.Send(strMessage.GetBuffer(nBuf),nBuf);
    strMessage.ReleaseBuffer();你做了吗,要不就会出现问题的。用CString Message;
    接受是没有问题的。
      

  15.   

    void CClientDlg::OnReceive()
    {
    int nRec;
    int buf=1024;
    CString strRec;
    nRec=m_connect.Receive(strRec.GetBuffer(buf),buf,0);
    strRec.ReleaseBuffer();
    strRec=strRec.Left(nRec);
             m_listmsg.InsertString(-1,strRec);
    }
    void CServerDlg::OnSend() 
    {
    UpdateData(TRUE);
    m_chat="server:"+m_chat;
    int m_nLength=m_chat.GetLength();
    m_connect.Send(m_chat.GetBuffer(m_nLength),m_nLength,0);
    m_chat.ReleaseBuffer();
    m_listmsg.InsertString(-1,m_chat);
    m_chat="";
    UpdateData(FALSE);
    }
    我是这么做的没有问题
      

  16.   

    当你receive之前有没有判断accept成功了,如果accept根本就没有成功,你receive当然会出错
      要判断accept那一步必须返回非零,表示成功了,才可以receive,否则跳出
      

  17.   

    检查recSo是否执行过Create(),去掉就好了。