小弟学习遇见困难,历经一日寻觅无路,特来请教各位专家,老师!
以下是一个网络通讯socket, 在send出特用的数据结构后,
出现了只有头一个字符获取的到的错误.PS: 客户端获取输入用户名,然后转换char后send出.
 send 出后服务器端永远只接受到第一个字母.PS: 但是我直接在程序里面写一串中文的话,服务器端可以成功接收到所有内容.
以下是代码片段./*
 结构体定义
*/typedef struct
{
short          head;
int    intbuf1;
int    intbuf2;
int            intbuf3;
int            intbuf4;
char        charbuf1[24];
char    charbuf2[24];
char    charbuf3[50];
char    charbuf4[50];
char    charbuf5[200];
bool    bool1;
bool           bool2;
bool           IsGM;
}mydata, * LPmydata;客户端 
=============================================================
mydata my; my.head = 0x0a;
my.IsGM = TRUE;
my.bool1 = TRUE; /* 
获取用户名
*/
CString csname;
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
ASSERT(pEdit!=NULL);
pEdit->GetWindowTextW(csname); 
char  name[24]; CString s; //sprintf(name,"%s",csname.GetBuffer(csname.GetLength()));
//s.Format(_T("%s"),name);
//MessageBox(s);
//sprintf(name,"%s",(LPCTSTR)(LPCTSTR)csname);
//strcpy(name,(LPCTSTR)(LPCTSTR)csname);
//strcpy(name,(char*)(LPCTSTR)(LPCTSTR)csname);
strcpy(my.charbuf1,(char*)(LPCTSTR)csname.GetBuffer(0)); //
//CString z;
//z.Format(_T("%s"),name);
//MessageBox(z);    //这个提示会提示乱码,但是我看了网站上很多转换char方法,不乱码了服务器也照样接收到一个字母. 
//strcpy(my.charbuf2, "890303");
//my.charbuf2 = "测试中";  PS: 这行就是测试中,直接写的中文,可以接收到.
my.intbuf1 = 123456789;
my.intbuf2 = 0000000001; char *P = (char*)&my;
int len = sizeof(mydata);

while (len){
int ret = send(sListen, P, len, 0);
if(SOCKET_ERROR == ret)
{
MessageBox(_T("错误,网络连接失败1-2!"));
break;
}
if(!ret)
{
MessageBox(_T("错误,网络连接已经中断1-3!"));
break;
}
len -= ret;
P += ret;
if(!len)
{
mydata *m;
CString ssss;
//ssss.Format(_T("%s"));
//MessageBox(TEXT("ssss"));
break;
}
PS: 这个是客户端发送的程序
下面是服务器端
===================================================================Ps: 我有一个接收的线程,线程判断到headle是登录后,转到这个程序来,同时提供了套接字和数据结构给这个块bool chat::login(SOCKET s,mydata *my)
{
//char cname[24],cpass[24];
//strcpy(cname,my->charbuf1);
msg("欢迎你[");
cout<<my->charbuf1;
msg("]\n");
return true;
Ps: 无论先把数据装入一个char再显示,或者强制转换格式/或者直接显示,都只有一个字母.例如:欢迎你 [d] ;}以上程序令我十分不解.为什么直接在代码输入的内容就可以全部接收.而获取文本输入域的就不可以呢?问题是不是出现在 cstring 和char 上呢?请老师教导!

解决方案 »

  1.   

    //pEdit->GetWindowTextW(csname); pEdit->GetWindowText(csname); unicode处理混乱。
      

  2.   

    USES_CONVERSION;
    strcpy(my.charbuf1,CT2A(csname));
      

  3.   

    另外,没事不要随便乱用GetBuffer,如果用了就一定要ReleaseBuffer
      

  4.   

    strcpy是按多字节字符串来复制,不是把Unicode转成多字节。可以用CT2A宏等方法来转换,或者直接用::GetWindowTextA按多字节的形式来取文字。
    另外,取字符串直接用CString对象就可以,不需要GetBuffer。
      

  5.   

    strcpy(my.charbuf1,(char*)(LPCTSTR)csname.GetBuffer(0)); 
    语法我就不说了,客户端发送数据前你本来就没取到名字!csname.GetBuffer(0)就只取CString第一个字符。令我不解的是你
    在上面还用了正确的一个语句csname.GetBuffer(csname.GetLength())
    记得用完Release! 
      

  6.   

    乱码的问题:
    首先你的结构体变量要初始化
    mydata my; 
    ZeroMemory(&my,sizeof(mydata));CString csname;
    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
    ASSERT(pEdit!=NULL);
    pEdit->GetWindowTextW(csname);
    // 将控件中的字符填入你的发送缓冲数组
    sprintf(my.charbuf1,"%s",csname);你发送的结构体数据并不大,没有必要用
    while()循环发送,直接
    int ret = send(sListen, &my, sizeof(my), 0); 再看看你服务器接收数据的代码?
      

  7.   


    学习了,以前一直是类似“const TCHAR * = str.GetBuffer()”这样的用,确实忽略这点了。