我在一个界面下得到一个CEdit中输入的内容,想把这个内容转化成字节发给服务端,比如CEdit框输入“123456”
那么发给服务端的应该是三个字节的内容格式12 34 56,但是传输的内容总是空的,但是调试的时候data里保存的结果是对的data[0]=18,data[1]=52,data[2]=86
发送的代码如下: CString strCmd = "";
GetDlgItemText(IDC_EDIT_NODEID, strCmd);
char data[10];
int strLen = Str2Hex(strCmd, data);//Str2Hex()就是将字符串转换成字节的,data是保存字节的char数组
if (m_clientSocket.m_bConnected)
{
m_clientSocket.m_nLength = m_MSG.GetWindowText(data, strLen); m_clientSocket.AsyncSelect(FD_WRITE);

}

解决方案 »

  1.   

    你这里根本就没有调用发送的代码呀!!!难道是“AsyncSelect(FD_WRITE)”??
      

  2.   

    对呀,AsyncSelect(FD_WRITE)是投了一个”写“事件,我发送是在MySocket类里边重写的。
      

  3.   

    你确定AsyncSelect(FD_WRITE)是投了个写事件? 应该是将写事件与socket关联了而已吧?  你调试这句后面能进你的 MySocket类里的发送代码?
      

  4.   

    你调试了吗 转换完了strLen==0?  不然转不转和发送一点关系都没...
      

  5.   

    调试了呀,如果我输入的是“123456”,转完后strLen = 3
      

  6.   

    你发送“123456”和发送0x12 0x34 0x56 有什么区别? 发送“123456”不就相当于是发送0x31 0x32 0x33 0x 34 0x35 0x36 ? 和转不转没关系  
      

  7.   

    我CEdit里的是CString类型的,但是我发送必须要发送三个字节的。如果不转的话岂不是文本框只能输入三个字符或数字?
      

  8.   

    我意思是 你调试看到发送“123456”和发0x12、0x34、0x56 发送的地方数据都对的 然后就是发送0x..不成功?
      

  9.   

    m_clientSocket.m_nLength = m_MSG.GetWindowText(data, strLen); 这里的m_nLength又是多少?
      

  10.   

    你发送的代码呢?send()/WSASend()的代码你是怎么写的?
      

  11.   

    我是把123456通过下面两个函数给转换成字节类型了char CNodeInfoDlg::HexChar(char c)
    {
    if((c>='0')&&(c<='9'))
    return c-0x30;
    else if((c>='A')&&(c<='F'))
    return c-'A'+10;
    else if((c>='a')&&(c<='f'))
    return c-'a'+10;
    else 
    return 0x10;
    }int CNodeInfoDlg::Str2Hex(CString str, char* data)
    {
    int t,t1;
    int rlen=0,len=str.GetLength();
    for(int i=0;i<len;)
    {
    char l,h=str[i];
    if(h==' ')
    {
    i++;
    continue;
    }
    i++;
    if(i>=len)
    break;
    l=str[i];
    t=HexChar(h);
    t1=HexChar(l);
    if((t==16)||(t1==16))
    break;
    else 
    t=t*16+t1;
    i++;
    data[rlen]=(char)t;
    rlen++;
    }
    return rlen;
    }
      

  12.   

    发送代码如下//发送
    void MySocket::OnSend(int nErrorCode)
    {
    Send(m_szBuffer, m_nLength, 0); m_nLength = 0; CInterentClientApp* pApp = (CInterentClientApp*)AfxGetApp();
    CInterentClientDlg* pDlg = (CInterentClientDlg*)pApp->m_pMainWnd; CString sendMesg ; sendMesg.Format("%s", m_szBuffer); AfxMessageBox("发送  "+sendMesg); strList.AddTail(sendMesg); memset(m_szBuffer, 0, sizeof(m_szBuffer)); //继续提请一个“读”网络事件,接收server消息, 当有消息时会自动调用OnReceive事件 AsyncSelect(FD_READ); CAsyncSocket::OnSend(nErrorCode);}
      

  13.   

    Send(m_szBuffer, m_nLength, 0); 在这打个断点 看下“123456”和0x12、0x34、0x56到底有什么区别
      

  14.   

    我把发送的代码改成这样的可以发送出去但是发的是ASCII值的控制字符CString strCmd = "";
    GetDlgItemText(IDC_EDIT_NODEID, strCmd);
    char data[10];
    int strLen = Str2Hex(strCmd, data);
    if (m_clientSocket.m_bConnected)
    {
    int n_Send = m_clientSocket.Send(data, strLen);
    }
      

  15.   

    data是什么发的就是什么  data应该是什么 你的程序 你自己可以控制
      

  16.   

    我想的是data应该是ox12,ox34,ox56但是不是这样的效果。不知道怎么改了。
      

  17.   

    你调试一编 data怎么变化的你不知道?
      

  18.   

    帮忙看看那里的错吧。char CNodeInfoDlg::HexChar(char c)
    {
    if((c>='0')&&(c<='9'))
    return c-0x30;
    else if((c>='A')&&(c<='F'))
    return c-'A'+10;
    else if((c>='a')&&(c<='f'))
    return c-'a'+10;
    else 
    return 0x10;
    }int CNodeInfoDlg::Str2Hex(CString str, char* data)
    {
    int t,t1;
    int rlen=0,len=str.GetLength();
    for(int i=0;i<len;)
    {
    char l,h=str[i];
    if(h==' ')
    {
    i++;
    continue;
    }
    i++;
    if(i>=len)
    break;
    l=str[i];
    t=HexChar(h);
    t1=HexChar(l);
    if((t==16)||(t1==16))
    break;
    else 
    t=t*16+t1;
    i++;
    data[rlen]=(char)t;
    rlen++;
    }
    return rlen;
    }
      

  19.   

    123456变成0x12 0x34 0x56  不就是18、52、86??
      

  20.   


    int StringToHex(const char* src,int n)
    {
    int hex = 0;
    for(int k = 0; k < n; k++)
    {
    hex = hex * 16 + (*src - '0');
    ++src;
    }
    return hex;
    }
    char str[] = "123456";
    int data[3];
    for(int k = 0; k < 3; k++)
    {
    data[k] = StringToHex(str + 2 * k,2);
    cout<<data[k]<<endl;
    }
    对于你的情况:
    char buff[256];
    m_edit.GetWindowText(buff,256);
      

  21.   

    你在send函数哪里打个断点,查看data和len的值
      

  22.   

    accii码 18本来就是乱码 18、52、86用字符来看不就是你上面图上显示的那样? 
      

  23.   

    既然调试没问题,那接收到的也该是这个。
    你接收到的是什么?
    receive代码呢?
      

  24.   

    >’
    要发的是这种格式:(0x3e) + 数据长度3字节(ASCII码表示)+包序号(‘0’-‘9’)+‘;’+命令+内容+‘。’其中内容就是我这里data得到的内容,那怎么把这些组合到一起呢。CString strCmd = "";
    GetDlgItemText(IDC_EDIT_NODEID, strCmd);
    strCmd = "62"+"数据长度"+"包号"+";"+"A"+strCmd+"。";
    char data[10];
    int strLen = Str2Hex(strCmd, data);
    if (m_clientSocket.m_bConnected)
    {
    int n_Send = m_clientSocket.Send(data, strLen);
    }
      

  25.   

    这无非就是把数据拼在一起,组成一个BYTE[],然后发送就完了
      

  26.   

    通常做通讯调试,涉及到Client和Server.无论是Client 还是Server程序写错了,都不会得到想要的结果。
    所以,建议先从网上找一个TCP的检测软件,用户检测自己发送或接收是否正确。如果出现误差,就慢慢寻找原因。