手捧仅有的50分跪求网络编程高手给小弟指正这几句代码的问题,不甚感激!

时间:2022-02-16 08:52:22
函数一:与目标主机建立socket连接
LRESULT CCreateConnectWindow::OnConnect(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    if (DoDataExchange(DDX_SAVE))
    {

    CDemoLogic* pLogic = CDemoLogic::GetInstance();

   socket_handle = socket(AF_INET,SOCK_STREAM, 0);

    if (socket_handle <=0)
       {
           MessageBox(_T("Socket创建失败"));
   return -1;
       }


sprintf(Target_Connect_IP, "%S", Target_Host_IP);

    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(Target_Host_Port);
    addr.sin_addr.s_addr=inet_addr(Target_Connect_IP);

    memset(&(addr.sin_zero),0,8);
    int result=connect(socket_handle,(struct sockaddr *)&addr,sizeof(addr));


    if (result < 0)
       {
           MessageBox(_T("目标主机连接失败"));
   return -1;
       }
    else
       {
   if (result==0)
   {
   CWindow btnRecord(GetDlgItem(IDC_CONNECT));
   btnRecord.SetWindowText(_T("断开"));
   btnRecord.SetDlgCtrlID(IDC_CONNECT_STOP);

   connect_state=0;

   }
       }
    }
    else
    {
     return 0;
    }
    return 0;
}
函数2:与目标主机断开连接
LRESULT CCreateConnectWindow::OnDisconnect(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{
CWindow btnRecord(GetDlgItem(IDC_CONNECT_STOP));
if (NULL == btnRecord.m_hWnd)
   {
   return 0;
   }
btnRecord.EnableWindow(FALSE);
    int result=closesocket(socket_handle);

if (result ==0 )
{
    btnRecord.SetWindowText(_T("连接"));
    btnRecord.SetDlgCtrlID(IDC_CONNECT);
    btnRecord.EnableWindow(TRUE);

connect_state=-1;

}
    return 0;
}
函数3:向目标主机发送数据
LRESULT CCreateConnectWindow::OnSendData(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
WTL::CString m_Static_Text=_T("") ;
    WTL::CString temp(_T("")) ;

if (DoDataExchange(DDX_SAVE))
{
       if (connect_state != 0 )
   {
   MessageBox(_T("请先建立连接..."));
   return -1;
   }
   CWindow btnRecord(GetDlgItem(IDC_SEND_DATA));
   char* buff = new char[BUFFER_SIZE];
   memset(buff,0,BUFFER_SIZE);
   LPTSTR buff1 =(LPTSTR)(LPCTSTR)buff;
   int data_num=btnRecord.GetWindowText(buff1,BUFFER_SIZE-1);
   if(data_num<=0)
   {
   MessageBox(_T("无数据要处理或数据拷贝到缓冲区失败"));
   return -1;
   }

   SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text ) ;
   temp.Format(_T("\n拷贝%d个字节到缓冲区成功")  , data_num) ;
   m_Static_Text +=  temp;
       Sleep(200);
   temp.Format(_T("\n数据发送中...") ) ;
   m_Static_Text +=  temp;
   SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text + _T("") ) ;

       Sleep(500);

       int send_data_num=send( socket_handle,buff,sizeof(buff1),0 );  

   SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text ) ; 
   temp.Format(_T("\n发送完毕") ) ;
   m_Static_Text +=  temp;
   temp.Format(_T("\n成功发送%d个字节到%S")  , data_num,Target_Connect_IP) ;
   m_Static_Text +=  temp;
   SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text + _T("") ) ;

       Sleep(500);

   SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text ) ; 
   temp.Format(_T("\n数据正在处理,需要5秒左右") ) ;
   m_Static_Text +=  temp;
   temp.Format(_T("\n5秒内请不要断开连接") ) ;
   m_Static_Text +=  temp;
   SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text + _T("") ) ;

   
   for ( int wait_time = 5 ;  wait_time >= 0 ;  wait_time-- )
   {
   if(wait_time>0)
   {
             SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text ) ; 
             temp.Format(_T("\n") ) ;
             m_Static_Text +=  temp;
             temp.Format(_T("Waitting %d...") ,wait_time) ;
             m_Static_Text +=  temp;
             SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text + _T("") ) ;
   }
   else
   {
     SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text ) ; 
             temp.Format(_T("\n") ) ;
             m_Static_Text +=  temp;
             temp.Format(_T("OK") ) ;
             m_Static_Text +=  temp;
             SetDlgItemText(IDC_STATIC_BUFF_SEND_REPORT , m_Static_Text + _T("") ) ;
   }
   Sleep(1000);
   }
   
}
else
{
   MessageBox(_T("请先建立连接..."));
   return -1;
}

    return 0;
}
这三个函数是我这个模块的核心功能,先和目标主机建立连接,然后向它发送协议数据触发主机的某一功能,要发送的协议是类似于:
<?xml version = "1.0" encoding = "UTF-8"?>
<cmd action="ReportVolumeInfo" type="request">
<version>1</version>
<Cseq>3390</Cseq>
<VideoSlave_ID>263b152474169ff9d919</VideoSlave_ID>
<VideoSlave_IPAddr>10.192.77.1</VideoSlave_IPAddr>
<record_vol_num>1</record_vol_num>
<RecordVolume>
<VolumeName>1337273665_2555215883_0</VolumeName>
<VolumeLoad>16295</VolumeLoad>                      
<pool_vol_size>2399625</pool_vol_size>
<pool_vol_max_press>28440</pool_vol_max_press>
</RecordVolume>
</cmd>
这样的,把这段协议copy到我的edit control里面点击发送后,主机并没有收到,请问各位大侠我上面的几个函数有没有什么问题啊?跪谢了!

19 个解决方案

#1


改成这样试试
TCHAR* buff = new TCHAR[BUFFER_SIZE];
memset(buff,0,BUFFER_SIZE * sizeof(TCHAR));
LPTSTR buff1 =(LPTSTR)(LPCTSTR)buff;
//...

//sizeof(buff1)求字符串长度,在这里是错误的
int send_data_num=send( socket_handle,buff,tcslen(buff1),0 );

#2


谢谢啊,但肯定不是这里的问题啊 ,tcslen提示没定义的标识符,send()的返回值不就是发送的字节的个数吗,我用变量int send_data_num存放send( socket_handle,buff,tcslen(buff1),0 )的返回值,得到的返回值是正确的啊,也就是比如我在edit control里面copy了500个字节的数据,发送后send的返回值是500,说明send发送了500字节的数据啊。
引用 1 楼  的回复:
改成这样试试

C/C++ code
TCHAR* buff = new TCHAR[BUFFER_SIZE];
memset(buff,0,BUFFER_SIZE * sizeof(TCHAR));
LPTSTR buff1 =(LPTSTR)(LPCTSTR)buff;
//...

//sizeof(buff1)求字符串长度,在这里是错误的
int send_data_nu……

#3


主机是一点数据都没收到???

你自己要一步步找问题

首先看看连接成功没有
其次发送前一步,看看发送的东西是什么,长度对不对

连接成功,发送数据和长度都对,就要看主机那边,是不是防火墙之类的原因

#4


服务器端的Socket也是你自己写的吗?还是其他客户的?
方便的话,留个qq,远程帮你看看。

#5


我在网上下载了一个发送协议的工具与主机连接上后发送协议数据过去,主机能收到并触发相应的动作,说明和主机防火墙没关系。但是用我自己写的发同样的协议数据过去就没有任何反应。与主机的连接应该是建立好的,connect(socket_handle,(struct sockaddr *)&addr,sizeof(addr))后定义变量int result接收connect的返回值,返回值为0,那说明是连接成功了的,数据的长度这些也没有问题。是不是协议数据发送的时候要经过什么处理之类的?

引用 3 楼  的回复:
主机是一点数据都没收到???

你自己要一步步找问题

首先看看连接成功没有
其次发送前一步,看看发送的东西是什么,长度对不对

连接成功,发送数据和长度都对,就要看主机那边,是不是防火墙之类的原因

#6


很感谢!我的QQ:179090698,可是我公司登录不了QQ啊,只能上几个技术性网站。
引用 4 楼  的回复:
服务器端的Socket也是你自己写的吗?还是其他客户的?
方便的话,留个qq,远程帮你看看。

#7


我想问一下各位大侠,我的这个思路上有没有出错?
先用socket()创建socket;
然后connect()创建和目标机子的连接;
然后send()向目标机子发送数据。
这个思路有问题吗?或者说处理这个问题究竟是不是用这样的机制?

#8


你发送前把要发送的内容AfxMessageBox显示出来,看看对不对。
协议对每一行的回车换行有没有要求

#9


主机那你能不能调试,看看收没收到数据,如果收到了,说明你组织的数据格式不对

#10


好的,非常感谢,我先用这个方法看要发送的内容用AfxMessageBox显示出来,看是否是对的再回来请教你们,太感谢了!
引用 8 楼  的回复:
你发送前把要发送的内容AfxMessageBox显示出来,看看对不对。
协议对每一行的回车换行有没有要求

#11


你可以在一台计算机上调试,就是把客户端里的IP地址改成127.0.0.1,这要样,当两个程序成功后再改成正式的IP地址.计算机的IP地址一定不要改成127.0.0.1

#12


在主机上怎么看有没有收到数据呢?我也不会看啊,呵呵,太菜了。
引用 9 楼 youyingbo 的回复:
主机那你能不能调试,看看收没收到数据,如果收到了,说明你组织的数据格式不对

#13


但是和主机连接肯定是成功了的,我把主机关掉,再连接的话就会返回连接失败,说明是连接函数没有问题,问题应该出在send上,但是MessageBox也不怎么会用呀,呵呵。

#14


如果你有主机的源程序,你就可以调试运行,在接收语句下一条语句设断点,当产生中断后,你就可以看到接收缓冲区里的数据了.

#15


char Rbuf;//主机的接收缓冲区
CString str;
str=(LPTSTR)(LPCTSTR)Rbuf;
MessageBox(str);
这么试试

#16


Sleep(500);
AfxMessageBox(buff);
  int send_data_num=send( socket_handle,buff,sizeof(buff1),0 ); 

#17


谢谢!会用了,呵呵。我在想会不会问题出在这一句啊:
int send_data_num=send( socket_handle,buff,sizeof(buff1),0 );   

这里面的buff并不是buff1,buff是char *类型的,这样的话buff只是一个指向第一个数据的指针,会不会send的时候就只send缓冲区里面的第一个数据过去?
引用 16 楼  的回复:
Sleep(500);
AfxMessageBox(buff);
  int send_data_num=send( socket_handle,buff,sizeof(buff1),0 );

#18


我没有主机源程序,我看主机收没收到数据只能看它有没有响应我的触发。
引用 15 楼  的回复:
char Rbuf;//主机的接收缓冲区
CString str;
str=(LPTSTR)(LPCTSTR)Rbuf;
MessageBox(str);
这么试试

#19


我认为问题可能并不是出在通信上。很有可能是你发送的数据包由于计算长度不正确或者是增加了什么特殊的字符,例如:\n\r之类的,导致在服务器上无法解析你的xml内容协议文件。
解决方案:
你不是已经下载了一个“发送协议的工具”了。建议你把这个工具调成服务器模式,用这个工具模拟服务器,你给该工具发送协议包,看看在工具上获取的协议包内容到底是什么。

#1


改成这样试试
TCHAR* buff = new TCHAR[BUFFER_SIZE];
memset(buff,0,BUFFER_SIZE * sizeof(TCHAR));
LPTSTR buff1 =(LPTSTR)(LPCTSTR)buff;
//...

//sizeof(buff1)求字符串长度,在这里是错误的
int send_data_num=send( socket_handle,buff,tcslen(buff1),0 );

#2


谢谢啊,但肯定不是这里的问题啊 ,tcslen提示没定义的标识符,send()的返回值不就是发送的字节的个数吗,我用变量int send_data_num存放send( socket_handle,buff,tcslen(buff1),0 )的返回值,得到的返回值是正确的啊,也就是比如我在edit control里面copy了500个字节的数据,发送后send的返回值是500,说明send发送了500字节的数据啊。
引用 1 楼  的回复:
改成这样试试

C/C++ code
TCHAR* buff = new TCHAR[BUFFER_SIZE];
memset(buff,0,BUFFER_SIZE * sizeof(TCHAR));
LPTSTR buff1 =(LPTSTR)(LPCTSTR)buff;
//...

//sizeof(buff1)求字符串长度,在这里是错误的
int send_data_nu……

#3


主机是一点数据都没收到???

你自己要一步步找问题

首先看看连接成功没有
其次发送前一步,看看发送的东西是什么,长度对不对

连接成功,发送数据和长度都对,就要看主机那边,是不是防火墙之类的原因

#4


服务器端的Socket也是你自己写的吗?还是其他客户的?
方便的话,留个qq,远程帮你看看。

#5


我在网上下载了一个发送协议的工具与主机连接上后发送协议数据过去,主机能收到并触发相应的动作,说明和主机防火墙没关系。但是用我自己写的发同样的协议数据过去就没有任何反应。与主机的连接应该是建立好的,connect(socket_handle,(struct sockaddr *)&addr,sizeof(addr))后定义变量int result接收connect的返回值,返回值为0,那说明是连接成功了的,数据的长度这些也没有问题。是不是协议数据发送的时候要经过什么处理之类的?

引用 3 楼  的回复:
主机是一点数据都没收到???

你自己要一步步找问题

首先看看连接成功没有
其次发送前一步,看看发送的东西是什么,长度对不对

连接成功,发送数据和长度都对,就要看主机那边,是不是防火墙之类的原因

#6


很感谢!我的QQ:179090698,可是我公司登录不了QQ啊,只能上几个技术性网站。
引用 4 楼  的回复:
服务器端的Socket也是你自己写的吗?还是其他客户的?
方便的话,留个qq,远程帮你看看。

#7


我想问一下各位大侠,我的这个思路上有没有出错?
先用socket()创建socket;
然后connect()创建和目标机子的连接;
然后send()向目标机子发送数据。
这个思路有问题吗?或者说处理这个问题究竟是不是用这样的机制?

#8


你发送前把要发送的内容AfxMessageBox显示出来,看看对不对。
协议对每一行的回车换行有没有要求

#9


主机那你能不能调试,看看收没收到数据,如果收到了,说明你组织的数据格式不对

#10


好的,非常感谢,我先用这个方法看要发送的内容用AfxMessageBox显示出来,看是否是对的再回来请教你们,太感谢了!
引用 8 楼  的回复:
你发送前把要发送的内容AfxMessageBox显示出来,看看对不对。
协议对每一行的回车换行有没有要求

#11


你可以在一台计算机上调试,就是把客户端里的IP地址改成127.0.0.1,这要样,当两个程序成功后再改成正式的IP地址.计算机的IP地址一定不要改成127.0.0.1

#12


在主机上怎么看有没有收到数据呢?我也不会看啊,呵呵,太菜了。
引用 9 楼 youyingbo 的回复:
主机那你能不能调试,看看收没收到数据,如果收到了,说明你组织的数据格式不对

#13


但是和主机连接肯定是成功了的,我把主机关掉,再连接的话就会返回连接失败,说明是连接函数没有问题,问题应该出在send上,但是MessageBox也不怎么会用呀,呵呵。

#14


如果你有主机的源程序,你就可以调试运行,在接收语句下一条语句设断点,当产生中断后,你就可以看到接收缓冲区里的数据了.

#15


char Rbuf;//主机的接收缓冲区
CString str;
str=(LPTSTR)(LPCTSTR)Rbuf;
MessageBox(str);
这么试试

#16


Sleep(500);
AfxMessageBox(buff);
  int send_data_num=send( socket_handle,buff,sizeof(buff1),0 ); 

#17


谢谢!会用了,呵呵。我在想会不会问题出在这一句啊:
int send_data_num=send( socket_handle,buff,sizeof(buff1),0 );   

这里面的buff并不是buff1,buff是char *类型的,这样的话buff只是一个指向第一个数据的指针,会不会send的时候就只send缓冲区里面的第一个数据过去?
引用 16 楼  的回复:
Sleep(500);
AfxMessageBox(buff);
  int send_data_num=send( socket_handle,buff,sizeof(buff1),0 );

#18


我没有主机源程序,我看主机收没收到数据只能看它有没有响应我的触发。
引用 15 楼  的回复:
char Rbuf;//主机的接收缓冲区
CString str;
str=(LPTSTR)(LPCTSTR)Rbuf;
MessageBox(str);
这么试试

#19


我认为问题可能并不是出在通信上。很有可能是你发送的数据包由于计算长度不正确或者是增加了什么特殊的字符,例如:\n\r之类的,导致在服务器上无法解析你的xml内容协议文件。
解决方案:
你不是已经下载了一个“发送协议的工具”了。建议你把这个工具调成服务器模式,用这个工具模拟服务器,你给该工具发送协议包,看看在工具上获取的协议包内容到底是什么。

#20