如何用CSocketfile和CArchive来接收发送一个自定义的结构体? 用CSocket实现网络编程,现在需要传送一个自定义的结构体,如何用CSocket和CArchive实现?有其它更简单的方法实现么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SOCKETclient1.create2.connect3.sendserver1.create2.bind3.listen 我现在还不知道csocketfile和Archive都是干什么用的看msdn看不懂 构造一个类CSocketFile的对象 CSocketFile file(&cli_s) ; 构造类CArchive的对象arIn、arOut,以用于数据的收和发。 CArchive arIn(&file , CArchive ::load) ;CArchive arOut(&file , CArchive ::store) ; 使用arIn和 arOut 进行收或发数据arIn >> value ;arOut << value ;其中,value是所传输的数据 摧毁所创建的CSocket、CSocketFile 、CArchive 等类的对象 我想问,如果不是用CSocket而是用winsock那如何传递结构呢?? to 勇敢的心:看了很多例子,搞不太清楚的就是“value”的意思,如过我定义一个结构体type people{ char* name; char* home; char* age;} Jack那么这个arIn >> value ;arOut << value 到底具体怎么写?然后又是怎么发送的呢? struct _data{char f1[1024];char f2[1024];}data;strcpy(data.f1,...)send(sock,(char*)&data,sizeof(data),0);recv(sock,&data,sizeof(data)); to howtotell(从何谈起) 我用你的方法,为什么客户端一发送数据,服务端的程序就退出了啊? 问题找到了:recv(sock,&data,sizeof(data));改成recv(sock,(char*)&data,sizeof(data)); 呵呵,一不小心就灌到两个角了!你看看这个:class CMessg : public CObject{protected: DECLARE_DYNCREATE(CMessg)public: CMessg();可用如下的代码定义数据包// Attributespublic: 你的数据成员;// Operationspublic: void Init();// Implementationpublic: virtual ~CMessg(); virtual void Serialize(CArchive& ar); // overridden for document i/o //转化成流#ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;#endif}; oyljerry(勇敢的心) :看了你定义的类,不过不太明白怎么用啊,而且这个和howtotell(从何谈起)说的方法好像不太一样,按howtotell(从何谈起)说的是不是可以直接发送结构体?你说的方法是要用Serialize(CArchive& ar),可不可以再详细一点说,具体怎么发送接收呢?gold_jin() :我用的是CSocket,我也想过将结构中的数据一个一个的传,但是有个问题,比如说,我先发送了结构体中的name数据,接着发送结构体中的age数据,在接收的时候,我如何知道接收到的包是结构体中的哪个数据? class CMsg : public CObject{public: CMsg(); virtual ~CMsg();public: int type; CString from; CString to; //CString sender; CString m_str;public: void Serialize(CArchive& ar);};void CMsg::Serialize(CArchive& ar){ // 发送消息 if(ar.IsStoring()) { ar << type; ar << from; ar << to; ar << m_str; } // 接收消息 else { ar >> type; ar >> from; ar >> to; ar >> m_str; }} CArchive* m_in; CArchive* m_out; m_in = new CArchive(m_socketfile, CArchive::load); m_out = new CArchive(m_socketfile, CArchive::store);void CClientSocket::OnReceive(int nErrorCode){ TRY { msg.Serialize(*m_in); ProcessMessage(); return true; } CATCH(CException, e) { m_in->Abort(); return false; } END_CATCH CSocket::OnReceive(nErrorCode);}bool CMyQQApp::SendMsg(void){ if(m_out != NULL) { TRY { msg.Serialize(*m_out); m_out->Flush(); return true; } CATCH(CException, e) { m_out->Abort(); delete m_out; m_out = NULL; return false; } END_CATCH } return false;} 万分感谢啊!原来用>>和<<就可以发送接收了,而不需要用send和recev了?看着感觉怪怪的,看来我还是没弄明白它的原理,大侠可以赐教么? to 勇敢的心:我有些明白了,如果让你创建的类继承CObject,那么就会继承Serialize()函数,可以用来将由这个类生成的对象序列化,可是序列化完成后如何发送,如何接收? to libraworm(我要改名)我用了你的方法,可是,接收数据时在执行到if(ar.IsStoring())这个判断语句时出现了问题:Server.exe 中的 0x7c250a3b (mfc70d.dll) 处未处理的异常:0xC0000005: 读取位置 0xcdcdcde5 时发生访问冲突。 无论如何我不建议你使用mfc socket因为问题实在太大,特别是在vs.net 2003中很多怪异的现象还是用api socket保险 如果不用mfc的序列化,该如何传递结构,并从结构中取得成员值 to beizijing(jing) 我现在在想用send,recv的方法。:-)我发现用send ,recv接收数据时,发现接收的数据在发送的数据后面多一些莫名其妙的数据?呵呵,不知道什么原因! to 勇敢的心:不好意思,我是菜鸟,能把你的几种方法,贴一些代码出来么?才开始howtotell(从何谈起)说的方法,我想知道你是怎么解决分离接收的数据的,还有你自己说的那个类,是怎么进行发送接收的? 记录集插入到表中 在线等,高手进, GetDlgItem是建立临时对象,疑惑 请MFC专家出手解决一个异常处理的问题 "打开方式" 选择程序的问题! 求助:消息传递能以有层次的结构的数据传递,如结构体? Acess97和acess2000有什么区别?? 如何画空心效果的直线 串口接收帧数据及数据提取处理以及传送 VS2012 update4 问题求解答(100分) 为什么线程一多就老出错 是不是我忘记关闭什么了 MessageBox的标题? ADO中当调用了AddNew后,如何取消掉所做的操作?
client
1.create
2.connect
3.send
server
1.create
2.bind
3.listen
看msdn看不懂
构造一个类CSocketFile的对象 CSocketFile file(&cli_s) ;
构造类CArchive的对象arIn、arOut,以用于数据的收和发。
CArchive arIn(&file , CArchive ::load) ;
CArchive arOut(&file , CArchive ::store) ;
使用arIn和 arOut 进行收或发数据arIn >> value ;arOut << value ;
其中,value是所传输的数据
摧毁所创建的CSocket、CSocketFile 、CArchive 等类的对象
type people
{ char* name;
char* home;
char* age;
} Jack那么这个arIn >> value ;arOut << value 到底具体怎么写?
然后又是怎么发送的呢?
{
char f1[1024];
char f2[1024];
}data;
strcpy(data.f1,...)send(sock,(char*)&data,sizeof(data),0);recv(sock,&data,sizeof(data));
我用你的方法,为什么客户端一发送数据,服务端的程序就退出了啊?
你看看这个:
class CMessg : public CObject
{
protected:
DECLARE_DYNCREATE(CMessg)
public:
CMessg();可用如下的代码定义数据包// Attributes
public:
你的数据成员;// Operations
public:
void Init();// Implementation
public:
virtual ~CMessg();
virtual void Serialize(CArchive& ar); // overridden for document i/o
//转化成流
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
{
public:
CMsg();
virtual ~CMsg();
public:
int type;
CString from;
CString to;
//CString sender;
CString m_str;
public:
void Serialize(CArchive& ar);
};
void CMsg::Serialize(CArchive& ar)
{
// 发送消息
if(ar.IsStoring())
{
ar << type;
ar << from;
ar << to;
ar << m_str;
}
// 接收消息
else
{
ar >> type;
ar >> from;
ar >> to;
ar >> m_str;
}
}
CArchive* m_in;
CArchive* m_out;
m_in = new CArchive(m_socketfile, CArchive::load);
m_out = new CArchive(m_socketfile, CArchive::store);void CClientSocket::OnReceive(int nErrorCode)
{
TRY
{
msg.Serialize(*m_in);
ProcessMessage();
return true;
}
CATCH(CException, e)
{
m_in->Abort();
return false;
}
END_CATCH CSocket::OnReceive(nErrorCode);
}
bool CMyQQApp::SendMsg(void)
{
if(m_out != NULL)
{
TRY
{
msg.Serialize(*m_out);
m_out->Flush();
return true;
}
CATCH(CException, e)
{
m_out->Abort();
delete m_out;
m_out = NULL;
return false;
}
END_CATCH
} return false;
}
if(ar.IsStoring())这个判断语句时出现了问题:Server.exe 中的 0x7c250a3b (mfc70d.dll) 处未处理的异常:0xC0000005: 读取位置 0xcdcdcde5 时发生访问冲突。
因为问题实在太大,特别是在vs.net 2003中
很多怪异的现象
还是用api socket保险
我现在在想用send,recv的方法。:-)
我发现用send ,recv接收数据时,发现接收的数据在发送的数据后面多一些莫名其妙的数据?呵呵,不知道什么原因!