作者:广东蒗缦m莎 | 来源:互联网 | 2023-07-31 16:34
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函数创建一个端口,用同一个端口 完成发送和接收(我创建了一个接收线程 接收网络数据)?
5 个解决方案
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发到对方,所以要做组包判断逻辑。
针对第3问
发送接收可以使用同一个线程,但效率不高,一般开两个线程,一个收一个发。
再有CSocket是MFC的对象,我一直认为直接使用socket api会更容易控制一些。
我要告诉你的是,通过网络发送或接收结构体,,必须使用字节对齐,否则,,,你可能会接收不到正确的数据
感谢Crob 回复
平均给分的,为何有的会没有给上呢?