关于SOCKET接收数据出错的问题

zhuzi1984 2007-06-26 01:19:40
我做了一个客户端,向服务器端发送数据,然后服务器端处理完后会给客户端回传日志。所以我在一个线程里做了一个死循环来接收数据,服务器端发送数据是这样的:如果数据已经处理完了就发处理完的数据,如果还没处理就发送R#。下面是线程处理函数:
UINT CRightPaneFrame::ReadyProc(LPVOID pParam)
{
CRightPaneFrame* me = (CRightPaneFrame*)pParam;
CStdioFile ExportFile;
ExportFile.Open(m_socket.user+"发送日志.txt",CFile::modeNoTruncate | CFile::modeReadWrite | CFile::modeCreate,NULL);
ExportFile.SeekToEnd();

char recvbuf[1000];
while (1)
{
memset(recvbuf, 0, sizeof(recvbuf));
if (m_socket.Receive(recvbuf,1000,0) == SOCKET_ERROR)
{
CString s;
s.Format("错误信息:%d",WSAGetLastError());
AfxMessageBox(s);
break;
}
if (recvbuf != NULL && recvbuf[0] == 'R')
{
CString recv,status,num,time,content,all;
recv.Format("%s",recvbuf);
if (recv != "R#")
{
int n = recv.Find("R");
recv = recv.Mid(n+1);
int i = recv.Find("#");
num = recv.Left(i);
recv = recv.Mid(i+1);
int j = recv.Find("#");
time = recv.Left(j);
recv = recv.Mid(j+1);
int a = recv.Find("#");
status = recv.Left(a);
content = recv.Mid(a+1);

if (status == "0")
all = time + "#" + num + "#" + "成功" + "#" + content;
else
all = time + "#" + num + "#" + "失败" + "#" + content;


ExportFile.WriteString(all+"\n");
}

else
{
ExportFile.Close();
break;
}
}
}
return 0;
}
可是出错了,我单步跟踪运行,发现第一次循环没问题,而且接收过来的数据也没问题,可是第二次循环的时候整个程序就出错退出了。
是在运行到if (m_socket.Receive(recvbuf,1000,0) == SOCKET_ERROR)这句话的时候出错的。
谁能帮帮我啊,救命啊!
...全文
353 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
firera 2007-06-30
  • 打赏
  • 举报
回复
char recvbuf[1000+1];

rxn = recv(sockid,1000,0);

可以看看,是不是第一次接收的时候,rxn<1000
第二次rxn=1000;

感觉会不会是'\0'造成的。
zhuzi1984 2007-06-29
  • 打赏
  • 举报
回复
哪位大哥能告诉我 怎么给分啊
zhuzi1984 2007-06-29
  • 打赏
  • 举报
回复
我换的方法是,在自己定义的类CMySocket里面定义一个CArray<CString,CString>对象m_array,然后重载OnReceive函数,在这个函数里把数据全部接收过来放在m_array里面,等全部接收完成了,再开一个线程去处理这些数据。
至于为什么这个方法可以,那种方法不可以,原因我也不清楚,觉得有可能是网络延时问题。
coldplay968 2007-06-28
  • 打赏
  • 举报
回复
没看懂哪里有错
zhuzi1984 2007-06-27
  • 打赏
  • 举报
回复
怎么给分啊
zhuzi1984 2007-06-27
  • 打赏
  • 举报
回复
问题已经解决了 我换了另一种方法接收数据 先谢谢各位了
吴双1983 2007-06-27
  • 打赏
  • 举报
回复
//客户端使用

CString ReciveStr; //接收字符信息

CString ClientSendStr;

CString ClientRecStr;
bool ClientSendMark;
bool ClientRecMark;
bool ClientMark;




UINT SocketClientRec(LPVOID lpParam)
{

//得到socket版本信息。
WORD wVersionRequested;// 定义版本信息变量
WSADATA wsaData;//定义数据信息变量
int err;//定义错误号变量
wVersionRequested = MAKEWORD(1,1);//给版本信息赋值
err = WSAStartup(wVersionRequested, &wsaData);//给错误信息赋值
if(err!=0)
{
::AfxMessageBox("Socket fail");
return 0;//告诉用户找不到合适的版本
}
else
{
if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1)
{

::AfxMessageBox("Socket fail");
WSACleanup();//告诉用户找不到合适的版本
return 0;
}
else
{

//#define PORT 34000 // Select any free port you wish

AfxSocketInit(NULL);
CSocket sockClient;
sockClient.Create();

// "127.0.0.1" is the IP to your server, same port
sockClient.Connect(IpStr, ClientPORT);
while(1)
{

if(ClientRecMark)
{
char *data=new char[48];
sockClient.Receive(data, 48); //Now we get the File Size first

ClientRecStr=data;
ClientRecMark=!ClientRecMark;

}

if(ClientSendMark)
{


sockClient.Send(ClientSendStr,48);
ClientSendMark=!ClientSendMark;
}

}

}
}




return 0;
zhuzi1984 2007-06-27
  • 打赏
  • 举报
回复
应该没有啊 跟这个线程有关的变量都是在这个函数里定义的
star119119 2007-06-27
  • 打赏
  • 举报
回复
内存操作出錯。

調試一下,看看 哪個變量操作由問題。
zhuzi1984 2007-06-26
  • 打赏
  • 举报
回复
我刚刚试了一下 服务器方发一条 客户端接收一条 这样没问题 可是让服务器跟客户端自己循环来发送接收就出错 到底怎么回事啊
zhuzi1984 2007-06-26
  • 打赏
  • 举报
回复
就是弹出那个有 终止 重试 取消这3个按钮的对话框 程序异常退出了
sms88 2007-06-26
  • 打赏
  • 举报
回复
帮顶
star119119 2007-06-26
  • 打赏
  • 举报
回复
什麽錯誤阿?

18,356

社区成员

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

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