很简单的例子,结果每次都只能接收到第一个字符,123就只收到1,abc就只收到a
服务端CSocket s,c;
AfxSocketInit();
BOOL bOptVal = TRUE;
         int bOptLen = sizeof(BOOL);
s.Socket();
s.SetSockOpt(SO_REUSEADDR,(void*)&bOptVal,bOptLen,SOL_SOCKET);
s.Bind(33333);
s.Listen(10);
s.Accept(c);
char msg[256]={0};
int recvLen=0;
c.Receive(msg,256);//但是这边只能收到第一个字符,后面的都没了
客户端CSocket c;
AfxSocketInit();
c.Create();
c.Connect(L"127.0.0.1",33333);
CEdit* ed=(CEdit*)this->GetDlgItem(IDC_EDIT_MSG);
CString msg;
ed->GetWindowTextW(msg);
c.Send(msg,msg.GetLength());//跟踪到这里的确是"abc"

解决方案 »

  1.   

    你的CSocket用的很不一般,也没有Create,据我查msdn也没有Socket()的成员函数,你是自己封装过一次弄的么~
      

  2.   

    CScoket怎么会没有Create呢
    也有Socket方法吧
    没有封装过
    两个方法的定义在afxsock.h里面BOOL Create(UINT nSocketPort = 0, int nSocketType=SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);BOOL Socket(int nSocketType=SOCK_STREAM, long lEvent =
    FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0, int nAddressFormat = PF_INET);另外
    如果这样
    int recvLen=c.Receive(msg,256);
    发送abc过来,msg里面只接收到a
    但是recvLen的值却是3,很奇怪
      

  3.   

    发送abc
    接收到的msg是
    msg[0]='a'
    msg[1]='\0'
    msg[2]='b'
    msg[3]='\0'
    ........
    ..............
      

  4.   

    你发送用的是unicode,接受方也必须用unicode处理。使用wchar_t来处理,不能用char
      

  5.   

    楼上正解。
    char[]当遇到0时表示结束。
    对于ASCII UNICODE编码时,第二字节正好为0;
    你可以将发送内容改为中文就会发现接收正常
      

  6.   

    还是不对
    如果是unicode的问题发送abc
    接收到的msg就应该是
    msg[0]='a'
    msg[1]='\0'
    msg[2]='b'
    msg[3]='\0'
    msg[4]='c'
    msg[5]='\0'可是没有'c'啊我改成这样wchar_t msg[256]={0};
        int recvLen=0;
        c.Receive(msg,256);接收到的信息变成'abcdef'
    可是我发送的是'abcdefghijk'只接收前5个字符?
    如果是中文,就变成前两个半中文了......
      

  7.   

    char的情况
       发送abc和abcd变成 a 0 b 0
       发送abcde和abcdef变成a 0 b 0 c 0
       发送abcdefg和abcdefgh变成a 0 b 0 c 0 d 0wchar_t的情况
       发送abc和abcd变成 ab
       发送abcde和abcdef变成abc
       发送abcdefg和abcdefgh变成abcd总之发送n个字符
    接收到得就是n/2然后四舍五入
      

  8.   

    把项目的字符集改成
    “使用多字节字符集”
    后解决问题还是想知道,如果使用原来的unicode字符集,如何解决?
      

  9.   

    发送和接收时,建议使用struct,强制转换成PBYTE发送,变长的在struct中指明附加数据长度
    接收时验证长度
    struct
    {
       UINT  操作类型;
       UINT  附加数据长度;
    };
    发送时:struct+附加数据
    接收时:接收数据长度>=sizeof(struct),接收数据长度-sizeof(struct)应该=struct.附加数据长度
      

  10.   

    如果你想继续用UNICODE环境,在客户端发送之前,先用WideCharToMultiByte将要发送的内容转换成ANSI格式的,再发送。服务端接收到后,用MultiByteToWideChar将接收到的内容再转成宽字节的,试试看
      

  11.   

    使用 WideCharToMultiByte和MultiByteToWideChar进行宽字符和字符的转换。
      

  12.   

    如楼上各位所说,客户端把CString转换为char*之后再进行发送就ok了
    服务端直接接受char*即可客户端代码改正如下: CEdit* ed=(CEdit*)this->GetDlgItem(IDC_EDIT_MSG);
    CString msg;
    ed->GetWindowTextW(msg);
    USES_CONVERSION;
    char* msg=T2A(msg);
    c.Send(ch,strlen(ch));unicode通过
    感谢各位,马上结贴