MFC socket 发送数据

qq_36001111 2016-09-07 10:40:45
直接发送
BYTE datatest[8]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
send(m_ClientSocket[0],(LPCSTR)datatest,8,0);
可以发送出去,但想加入十六进制转换就出现问题了,大家能帮看看问题出在哪吗?现在是发送不出去数据,接收不到
void CtestDlg::OnBnClickedBtnsend()
{
// TODO: 在此添加控件通知处理程序代码

CString str,sTemp;
CByteArray hexdata;
DWORD dwBytesWritten=1024;
GetDlgItem(IDC_EDITsend)-> GetWindowText(strOut);
if (m_stats==1)
{
if(m_CHECKsend)
{
int i,n;
CString strTemp,str;
dwBytesWritten = ConvertHexC2String(strOut,hexdata);
n = hexdata.GetSize();
for(i=0;i<n;i++)
{
str.Format("%c", hexdata[i]);
strTemp += str;
}
strOut = strTemp;
send(m_ClientSocket[0],(LPCSTR)strOut,sizeof(strOut),0);
}
else
GetDlgItem(IDC_EDITsend)-> GetWindowText(str);

sTemp = DisplayHex2CString(str);
SetDlgItemText(IDC_EDITsend,strOut);
}

send(m_ClientSocket[0],(LPCSTR)strOut,sizeof(strOut),0);
}

CString DisplayHex2CString(CString Data)
{
CString sResult;
CString sTemp;
int Data_Length;
Data_Length = Data.GetLength();
if (Data_Length == 0) return "";
char *pchar = new char[Data_Length];
//用了new分配内存空间,要记得释放
strncpy(pchar,Data,Data_Length);
for(int i=0; i<Data_Length; i++)
{
sTemp.Format("%02X",pchar[i]);
sResult = sResult + sTemp;
}
delete pchar; //释放内存空间
return sResult;
}


int ConvertHexC2String(CString str, CByteArray &senddata)
{
//先判断输入字符串是否2个字符一组
int str_Length,iLength;
int hexdata, l_data;
char hstr,lstr;
char cTemp;
str_Length = str.GetLength();
iLength = 0;
senddata.SetSize(str_Length/2); //预先设置数组长度,不设置时,允许有错
char *ppchar = new char[str_Length];
strncpy(ppchar,str,str_Length);
for(int i=0; i<str_Length; )
{
cTemp = ppchar[i];
if(cTemp == ' ')
{
//iLength--;
i++;
continue; //如检测到空格则跳过,继续下一次循环
}
else
{
hstr = ppchar[i]; //取出字符作为16进制高位
i++;
lstr = ppchar[i]; //取出下一个字符作为16进制低位
if(lstr == ' ') //若取出的低位为空格,则不符合16进制2个一组的格式,终止循环
{
AfxMessageBox("请按照16进制每2个字符一组的方式输入",MB_ICONERROR);
break;
}
else
{
hexdata = ConvertHexChar(hstr); //高位转换为相应的0进制
l_data = ConvertHexChar(lstr); //低位转换为相应的10进制
if( (hexdata == -1) || (l_data == -1) )
{
AfxMessageBox("请按照16进制字符要求输入",MB_ICONERROR);
break;
}
else
hexdata = hexdata*16 + l_data; //安装16进制方式高位低位合并
senddata[iLength] = (char)hexdata; //int整型数转换为char字符型,并存入数组senddata[]
i++; //进入下一次循环
iLength++; //成功转换一组(2个)字符,记录长度加1
}
}
}
senddata.SetSize(iLength);
delete ppchar;
return iLength;
}


...全文
255 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36001111 2016-09-07
  • 打赏
  • 举报
回复
大家帮忙看看,谢谢
qq_36001111 2016-09-07
  • 打赏
  • 举报
回复
有知道的吗,帮忙看看
qq_36001111 2016-09-07
  • 打赏
  • 举报
回复
多谢大家,我找到问题了。
encoderlee 2016-09-07
  • 打赏
  • 举报
回复
注意检查每个函数的返回值,以判断错误出现在哪里,比如send的返回值检查一下
cutmelon 2016-09-07
  • 打赏
  • 举报
回复
引用 6 楼 qq_36001111 的回复:
[quote=引用 4 楼 cutmelon 的回复:] 没太仔细看,但是 send(m_ClientSocket[0],(LPCSTR)strOut,sizeof(strOut),0); 这里的sizeof合适吗?
恩,编译的时候没有问题,我在网上搜相关的资料,看有人也是这样写的,可以用[/quote] 哭笑不得了,看这句的意思应该是把一个字符串内容发出去吧,sizeof(strOut)==sizeof(CString),这长度能对吗?至少也得是 send(m_ClientSocket[0],(LPCSTR)strOut,strOut.Length(),0);
赵4老师 2016-09-07
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 仅供参考:
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
qq_36001111 2016-09-07
  • 打赏
  • 举报
回复
引用 4 楼 cutmelon 的回复:
没太仔细看,但是 send(m_ClientSocket[0],(LPCSTR)strOut,sizeof(strOut),0); 这里的sizeof合适吗?
恩,编译的时候没有问题,我在网上搜相关的资料,看有人也是这样写的,可以用
qq_36001111 2016-09-07
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
恩,自己在学习中,我是硬件测试,但现在临时编写测试小工具,刚入手,这个问题自己改了两天了,还是不行,所以想问问大家,入门比较困难,大家的一句点拨,可能会对我帮助很大。
cutmelon 2016-09-07
  • 打赏
  • 举报
回复
没太仔细看,但是 send(m_ClientSocket[0],(LPCSTR)strOut,sizeof(strOut),0); 这里的sizeof合适吗?
赵4老师 2016-09-07
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧