读书人

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

发布时间: 2012-02-28 13:06:35 作者: rapoo

关于SOCKET接收数据出错的问题
我做了一个客户端,向服务器端发送数据,然后服务器端处理完后会给客户端回传日志。所以我在一个线程里做了一个死循环来接收数据,服务器端发送数据是这样的:如果数据已经处理完了就发处理完的数据,如果还没处理就发送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)这句话的时候出错的。
谁能帮帮我啊,救命啊!

[解决办法]
内存操作出。

一下,看看 哪量操作由。
[解决办法]
//客户端使用

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;

读书人网 >VC/MFC

热点推荐