项目socket通信错误返回10035,获取服务器长base64编码错误

秃头程序媛 2017-10-16 05:23:05
因为项目需要调用服务器接口获取base64文件流,但是socket的通信循环接收到一半失败,返回10035的套接字错误,网上查阅相关资料不是很明白,而且接收到一半的base64文件流打印出来发现编码有问题,每次循环都会在末尾出现 ‘烫烫烫烫T’ 的字符错误,求大神支招,感谢!!
...全文
903 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2017-10-17
  • 打赏
  • 举报
回复

while(1)
{ 
 num=recv(aSocket,szRecValue,4096,0);
 if(num > 0)
 {
   szRecValue[num] = '\0';
   m_rece.Append(szRecValue);
 }
 else if(num == SOCKET_ERROR)
 {
   DWORD dwErr = aSocket.GetLastError();
   if(dwErr == WSAEWOULDBLOCK)  //10035
   {
      //继续等待接收
   }
   else
   {
      CString szMsg;
      szMsg.Format("%d", dwErr);
      AfxMessageBox(szMsg);
      break;
   }
 }
 else
 {
    m_rece.Format("%s",szRecValue); 
    CString strLog;
    strLog.Format("接收到的值是->%s,接收的错误类型是->%d,接收的大小是->%d",m_rece,aSocket.GetLastError(),m_rece.GetLength());
    AfxMessageBox(strLog);
    break;
  }
}
秃头程序媛 2017-10-17
  • 打赏
  • 举报
回复
十分感谢,完美解决,谢谢大佬解惑。
秃头程序媛 2017-10-17
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
szRecValue[num] = '\0'; //先追加结束符0 m_rece.Append(szRecValue);
谢谢大佬,解决其中base64字符问题了。不过还有一个从接口返回超长base64流中途报10035套接字错误,不知大佬会不会?
zgl7903 2017-10-16
  • 打赏
  • 举报
回复
szRecValue[num] = '\0'; //先追加结束符0 m_rece.Append(szRecValue);
秃头程序媛 2017-10-16
  • 打赏
  • 举报
回复
本人网络通信代码如下 if(aSocket.Connect(strIP,strPort)) { //HTTP头信息 char szRecValue[4096] = {0}; CString strSend=_T("");CString strRevc; strSend.Append("POST "); strSend.Append(m_interface);//接口名称 strSend.Append(" HTTP/1.1\r\n"); strSend.Append("Content-Type:text/xml;charset=UTF-8\r\n"); strSend.Append("nSOAPAction:'https://www.example.org/login/login' \r\n"); strSend.Append("User-Agent:Apache CXF 3.0.1 \r\n"); CString strLength=_T(""); strLength.Format("Content-Length:%d \r\n",m_send.GetLength()); strSend.Append(strLength); CString strHost=_T(""); strHost.Format("Host:%s:%d\r\n",strIP, strPort);//连接的ip地址和端口号 strSend.Append(strHost); strSend.Append("Connection:Keep-Alive \r\n"); strSend.Append("\r\n"); strSend.Append(m_send); CSysLog::GetInstance()->SetLogPath("E:\\"); CSysLog::GetInstance()->WriteLog(CSysLog::TYPE_INFO,strSend,"");//写日志 aSocket.Send(strSend, strSend.GetLength()); //发送内容给服务器 string * szRec; //szRecValue //阻塞等待接收结果,超时或没接收到数据则返回 int num=0; Sleep(1000); do{ //接收服务器发送回来的内容(该方法会阻塞, 在此等待有内容接收到才继续向下执行) //if ((num=aSocket.Receive((void *)szRec->c_str(), 4096))<0)//判断是否没有返回 if((num=recv(aSocket,szRecValue,4096,0))<0 ) {//错误代码10035 CString szMsg; szMsg.Format("%d",aSocket.GetLastError()); AfxMessageBox(szMsg); return NULL; } else if (num>0)//接收到返回值 { m_rece.Append(szRecValue); if (m_rece == "") { m_rece.Append(szRecValue); } } else { m_rece.Format("%s",szRecValue); CString strLog; strLog.Format("接收到的值是->%s,接收的错误类型是->%d,接收的大小是->%d",m_rece,aSocket.GetLastError(),m_rece.GetLength()); AfxMessageBox(strLog); return NULL; } } while (num>0);//结束do,当num==0时

18,356

社区成员

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

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