CSocket如何接收和发送结构体

german010 2008-06-29 01:03:22
1 使用CSocket类发送一个结构体数据:
CSocket FaSongSocket

struct message
{
unsigned int a;
unsigned int b;
unsigned int c;
char number[32];
unsigned int datalen;
char data[100];
} ;
struct message regmsg={1,0,2,{"german"},5,{"hello"}};
struct message *pregmsg = NULL;
pregmsg = ®msg;

FaSongSocket.SendTo( pregmsg,sizeof(regmsg),2330,"192.168.1.60");//发送数据
如上面所示 发送数据过程是否正确



2 使用CSocket类接收一个结构体数据:

struct message
{
unsigned int a;
unsigned int b;
unsigned int c;
char number[32];
unsigned int datalen;
char data[100];
} ;

struct message recvmsg;

CSocket m_ReceiveSocket;
char *buff1[256];
m_ReceiveSocket.Receive(buff1,256);
memcpy(&recvmsg, 此处如何写呢, sizeof(recvmsg));
得到buff1后如何分解 得到结构体的内容?
3 另外 发送和接收 结构体是否
可以 只创建一个 CSocket对象呢,然后使用 Creat函数创建一个端口,用同一个端口 完成发送和接收(我创建了一个接收线程 接收网络数据)?
...全文
316 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
german010 2008-07-16
  • 打赏
  • 举报
回复
感谢Crob 回复
平均给分的,为何有的会没有给上呢?
grewav 2008-07-01
  • 打赏
  • 举报
回复
我要告诉你的是,通过网络发送或接收结构体,,必须使用字节对齐,否则,,,你可能会接收不到正确的数据
Crob 2008-06-29
  • 打赏
  • 举报
回复
针对第3问
发送接收可以使用同一个线程,但效率不高,一般开两个线程,一个收一个发。
再有CSocket是MFC的对象,我一直认为直接使用socket api会更容易控制一些。
Crob 2008-06-29
  • 打赏
  • 举报
回复
CSocket m_ReceiveSocket;
char *buff1[256];
int nRecv = m_ReceiveSocket.Receive(buff1,256);
if(nRecv > 0){
memcpy(&recvmsg, buff1, nRecv);
//...此处要做数据包是否完整的判断,不完整则继续recv后再接在recvmsg后面,直到判断到是一个完整的包为止。

//如果判断接收到数据包完整,则..
message *msg = (message*)recvmsg;

//msg中就是你要的数据结构

}

实际通讯情况中可能还不是这么简单,应该要对数据包加包头标记、检验位,因为tcp通讯不能保证每次总将一整个struct发到对方,所以要做组包判断逻辑。
蒋慧平 2008-06-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 german010 的帖子:]
1 使用CSocket类发送一个结构体数据:
CSocket FaSongSocket

struct message
{
unsigned int a;
unsigned int b;
unsigned int c;
char number[32];
unsigned int datalen;
char data[100];
} ;
struct message regmsg={1,0,2,{"german"},5,{"hello"}};
struct message *pregmsg = NULL;
pregmsg = ®msg;

FaSongSocket.SendTo( (char*)pregmsg,sizeof(regmsg),2330,"192.168.1.60");将结构体指针强制转换

2 使用CSocket类接收一个结构体数据:

struct message
{
unsigned int a;
unsigned int b;
unsigned int c;
char number[32];
unsigned int datalen;
char data[100];
} ;


struct message recvmsg;

CSocket m_ReceiveSocket;
char *buff1[256];
m_ReceiveSocket.Receive(buff1,256);
memcpy(&recvmsg, buff1, sizeof(recvmsg)); //

[/Quote]
3 另外 发送和接收 结构体是否
可以 只创建一个 CSocket对象呢,然后使用 Creat函数创建一个端口,用同一个端口 完成发送和接收(我创建了一个接收线程 接收网络数据)?
可以进行双向通信

18,356

社区成员

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

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