不太会发图。。界面就只有一个发送信息的按钮和两个编辑框,IDC_EDIT_SENDMSG是当前要说的话,IDC_EDIT_RECORD是一个显示聊天记录的大编辑框。问题如下:
我在某一端(如客户端)的编辑框里输入一串字符,如“qwerwrerwwerew”,另一端收到的都只是前四个字符,也就是“qwer”,服务器给客户端发的时候也是一样。我在两端都设置断点看了一下,发出去之前从IDC_EDIT_SENDMSG获取的文字是完整的字符串,但是另一端接收过来就只能收到前四个字符,百思不得其解,求助大神!以下是代码(因为两端都有这样的问题,所以为了方便只贴服务端的了):
 void CTestDlg::InitSocket()  //初始化套接字
 {
WSADATA wsadata;
 ::WSAStartup(MAKEWORD(2,2),&wsadata);
 m_socket = ::socket(AF_INET,SOCK_STREAM,0);
 ::WSAAsyncSelect(m_socket,this->m_hWnd,WM_CONNECT,FD_ACCEPT|FD_READ);
 SOCKADDR_IN addr;
 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 addr.sin_family = AF_INET;
 addr.sin_port = htons(8888);
 bind(m_socket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
 listen(m_socket,2);
 }
 
LRESULT CTestDlg::OnConnect(WPARAM wParam,LPARAM lParam)   /*用的VC2008,一开始设置的函数类型是void,但是报错说不能将void类型的转换成LRESULT型的,我就干脆改成LRESULT型的了*/
 {
switch(lParam)
 {
 case FD_ACCEPT:
   {
    SOCKADDR addr;
    int len;
    len = sizeof(SOCKADDR);
    GetDlgItem(IDC_STATUS)->SetWindowText("有新的连接到来!");//一个静态文本, 表明当前状态
    tem = ::accept(m_socket,(SOCKADDR*)&addr,&len);//建了两个SOCKET,分别是m_Socket和tem,一个用于连接另一个绑定
    break;
   }
 case FD_READ:
   { 
   char buf[100] = "";
    recv(tem,buf,sizeof(buf),0);//自己感觉问题好像出在这里,因为字符串发送成功了,却只留下了四个字符,奇怪~~
    GetDlgItem(IDC_EDIT_RECORD)->SetWindowText(buf);//在“聊天记录”那个大编辑框里显示收到的buf,下断点看了看,接收的就只有四个字符,后面的根本没接收到
    break;
   }
 }
 return 0;
 }
 
谢谢!
 

解决方案 »

  1.   

    谢谢回复,现在两端都能接到信息,但只能接到4个字符,也就是说发送和接收是可用的,但是信息不全,如果send或recv有问题的话应该什么都接不到才对啊。。
      

  2.   

    问题解决了,谢谢你啊!我判断了两端send()的返回值,最后发现发出的时候确定只发了4个字符,因为send的第三个参数写的是sizeof(str),直接成了CString类型的大小4了,所以才会只发出4个字符,现在我改成了str.GetLength(),完全正常了,十分感谢!
      

  3.   

    WSAAsyncSelect. 我曾经蛋疼死