TCP/IP 发送文件只能收到第一个字符问题

anan   2009-11-24 17:26 楼主
今天在EVC上改了一个TCP/IP的程序 目的是把打开一个文件 把内容显示到编辑框里 然后发送到PC上 在大家的帮助下 功能基本实现了 现在的情况是显示  Read OK  但没显示到编辑框里 这还是其次 因为可以发送了 但问题主要是只能发送文件的第一个字符 大家帮忙看看啊
ClientExDlg::OnSendfile()
{
   CFile MyFile;
   TCHAR str[100];
   DWORD count;
   CHAR  szBuf[256];
   UpdateData(true);
   CString s;
   MyFile.Open (_T("\\qwe.dat"),CFile::modeRead);
   long sendlen =MyFile.GetLength() ;              //得到文件长度
   count=MyFile.Read ( szBuf,  sendlen);           //读文件
   s.Format(_T("%S"),szBuf);                       //注意是大写的S
   m_SendEdit=s;                                   //将文件内容输出到编辑框
   MyFile.Close ();                                //关闭文件
   UpdateData(false);                             //更新显示
   AfxMessageBox(_T("Read OK"));                  //输出读成功消息     
}
qwe的内容是123,但是pc只能收到1

回复评论 (13)

看不到发送啊
点赞  2009-11-24 17:31
TCP/IP原来的程序是在编辑框输入字符 然后点 发送 的Button就发出去了 我是想着把文件的内容读到那个编辑框里 然后在点 发送 的Button发送
void CTCPClientExDlg::OnSend()
{
        int nErrorCode;
        int cnt = 0, actlen = 0;

        if (m_Socket == NULL)
                return;

        UpdateData(TRUE);
        int sendlen = m_SendEdit.GetLength();                                 /* 取得输入字符串长度 */
        char *psendbuff = new char[sendlen];

        for(int i = 0; i < sendlen;i++)
                psendbuff = (char)m_SendEdit.GetAt(i);                 /* 转换为单字节字符 */
       
        while(cnt < sendlen)
        {        // 发送数据
                actlen = send(m_Socket, psendbuff + cnt, sendlen - cnt, 0);
                if (actlen == SOCKET_ERROR )
                {
                        MessageBox(_T("TCP 数据发送失败!"));
                        nErrorCode = WSAGetLastError();
                        delete[] psendbuff;
                        return;
                }

                cnt = cnt + actlen;
                if (cnt < sendlen)
                        Sleep(1000);
        }
       
        delete[] psendbuff;
}
点赞  2009-11-24 19:49
你发完以后closesocket看一下什么现象
点赞  2009-11-25 07:46
楼主,你这个问题估计还是UNICODE编码的问题。SOCKET发送最好不用UNICODE。
现象是只能发送一个,但实际上可能是发送或者接收时被截断了。
点赞  2009-11-25 09:02
我在CTCPClientExDlg::OnSend() 函数后面加上
        Sleep(1000);
        closesocket(m_Socket);
还是只能收到一个字符 然后就是就是连接断开啊
点赞  2009-11-25 09:11
把打开一个文件 把内容显示到编辑框里  m_SendEdit是在类向导中 你的编辑框 要设置的

  CFile MyFile;
  CString m_FileName;

  CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,_T("All Files(*.*)|*.*||"));
     
if(FileDlg.DoModal()==IDOK)
{

                 m_FileName=FileDlg.GetPathName();
               
                 MyFile.Open (m_FileName,CFile::modeRead);  //打开文件

                DWORD sendlen =MyFile.GetLength() ; //得到文件长度
                CHAR *szBuf=new CHAR [sendlen];//开辟存储空间
                MyFile.Read ( szBuf,  sendlen); //读文件

        m_SendEdit.Format(_T("%S"),szBuf);                        //注意是大写的S
                MyFile.Close (); //关闭文件
                UpdateData(false); //更新编辑框显示
                AfxMessageBox(_T("Read OK")); //输出读成功消息
        delete []szBuf;//清除存储空间

}
点赞  2009-11-25 09:20
把编辑框里的内容 然后发送到PC上          m_SendEdit是在类向导中 你的编辑框 要设置的
       int nErrorCode;
        int cnt = 0, actlen = 0;

        if (m_Socket == NULL)
                return;


        int sendlen = m_SendEdit.GetLength();                                 //取得输入字符串长度
        char *psendbuff = new char[sendlen];

        for(int i = 0; i < sendlen;i++)
                psendbuff = (char)m_SendEdit.GetAt(i);                 // 转换为单字节字符
       
        while(cnt < sendlen)
        {
                actlen = send(m_Socket, psendbuff + cnt, sendlen - cnt, 0);
                if (actlen == SOCKET_ERROR )
                {
                        MessageBox(_T("TCP 数据发送失败!"));
                        nErrorCode = WSAGetLastError();
                        delete[] psendbuff;
                        return;
                }

                cnt = cnt + actlen;
                if (cnt < sendlen)
                        Sleep(1000);
        }
       
        delete[] psendbuff;
点赞  2009-11-25 09:22
用最简单的例子先做些测试
点赞  2009-11-25 09:28
我重新建了一个工程 只实现读取文件内容到编辑框 可是编辑框还是只有文件内容的第一个字符 程序有问题?
点赞  2009-11-25 15:15
引用: 引用楼主 l840828 的回复:
今天在EVC上改了一个TCP/IP的程序 目的是把打开一个文件 把内容显示到编辑框里 然后发送到PC上 在大家的帮助下 功能基本实现了 现在的情况是显示? Read OK? 但没显示到编辑框里 这还是其次 因为可以发送了 但问题主要是只能发送文件的第一个字符 大家帮忙看看啊
ClientExDlg::OnSendfile()
{
? CFile MyFile;
? TCHAR str[100];
? DWORD count;
? CHAR? szBuf[256];
? UpdateData(true);
? CString s;
? MyFile.Open (_T("\\qwe.dat"),CFile::modeRead);
? long sendlen =MyFile.GetLength() ;? ? ? ? ? ? ? //得到文件长度
? count=MyFile.Read ( szBuf,? sendlen);? ? ? ? ? //读文件
? s.Format(_T("%S"),szBuf);? ? ? ? ? ? ? ? ? ? ? //注意是大写的S
? m_SendEdit=s;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //将文件内容输出到编辑框
? MyFile.Close ();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //关闭文件
? UpdateData(false);? ? ? ? ? ? ? ? ? ? ? ? ? ? //更新显示
? AfxMessageBox(_T("Read OK"));? ? ? ? ? ? ? ? ? //输出读成功消息? ?
}
qwe的内容是123,但是pc只能收到1


先讲显示的问题,楼主你直接用MessageBox把s字符串显示出来看看是不是你想要的内容,在考虑是否是编辑框没刷新显示。
点赞  2009-11-25 15:45
引用: 引用 10 楼 wliaoc 的回复:
引用楼主 l840828 的回复:
今天在EVC上改了一个TCP/IP的程序 目的是把打开一个文件 把内容显示到编辑框里 然后发送到PC上 在大家的帮助下 功能基本实现了 现在的情况是显示? Read OK? 但没显示到编辑框里 这还是其次 因为可以发送了 但问题主要是只能发送文件的第一个字符 大家帮忙看看啊
ClientExDlg::OnSendfile()
{
? CFile MyFile;
? TCHAR str[100];
? DWORD count;
? CHAR? szBuf[256];
? UpdateData(true);
? CString s;
? MyFile.Open (_T("\\qwe.dat"),CFile::modeRead);
? long sendlen =MyFile.GetLength() ;? ? ? ? ? ? ? //得到文件长度
? count=MyFile.Read ( szBuf,? sendlen);? ? ? ? ? //读文件
? s.Format(_T("%S"),szBuf);? ? ? ? ? ? ? ? ? ? ? //注意是大写的S
? m_SendEdit=s;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //将文件内容输出到编辑框
? MyFile.Close ();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //关闭文件
? UpdateData(false);? ? ? ? ? ? ? ? ? ? ? ? ? ? //更新显示
? AfxMessageBox(_T("Read OK"));? ? ? ? ? ? ? ? ? //输出读成功消息? ?
}
qwe的内容是123,但是pc只能收到1


先讲显示的问题,楼主你直接用MessageBox把s字符串显示出来看看是不是你想要的内容,在考虑是否是编辑框没刷新显示。
我把最后一句改成        MessageBox(s)
显示的只有文件内容的第一个字符  到底是什么地方出问题了呢
点赞  2009-11-25 16:28
设置断点跟踪一下,这样比较好定位问题。
另外,你试试看把那个大写的S换成小写的试试看。
你用UltraEdit打开qwe.dat文件,以二进制的方式显示,贴出来让大家看看。
点赞  2009-11-25 22:48
谢谢 sunrain_hjb 就是把大写的S换成小写的就对了那句程序后面还来个注释 //注意是大写的S 残念
点赞  2009-11-26 08:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复