首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-02-28 
关于SOCKET接收数据出错的问题我做了一个客户端,向服务器端发送数据,然后服务器端处理完后会给客户端回传

关于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;

热点排行