我试图编写一个代码,我看到一些分布式应用程序看到它的工作,但我收到一个错误。我试图看到消息的工作
代码是
class Address {
public:
char addr[6];
Address() {}
Address(string address) {
size_t pos = address.find(":");
int id = stoi(address.substr(0, pos));
short port = (short)stoi(address.substr(pos + 1, address.size()-pos-1));
memcpy(&addr[0], &id, sizeof(int));
memcpy(&addr[4], &port, sizeof(short));
}
};
enum MsgTypes{
JOINREQ,
JOINREPLY,
DUMMYLASTMSGTYPE,
HEARTBEAT
};
/**
* STRUCT NAME: MessageHdr
*
* DESCRIPTION: Header and content of a message
*/
typedef struct MessageHdr {
enum MsgTypes msgType;
}MessageHdr;
typedef struct en_msg {
// Number of bytes after the class
int size;
// Source node
Address from;
// Destination node
Address to;
}en_msg;
void send(Address *myaddr, Address *toaddr, char *data, int size);
int main()
{
MessageHdr *msg;
size_t msgsize = sizeof(MessageHdr) + sizeof(Address) + sizeof(long) + 1;
int id=233;
short port =22;
long heartbeat=1;
string s=to_string(id)+to_string(port);
string s1=to_string(id+1)+to_string(port+1);
Address *addr= new Address(s);
Address *toaddr= new Address(s);
msg->msgType = JOINREQ;
memcpy((char *)(msg+1), addr, sizeof(addr));
memcpy((char *)(msg+1) + 1 + sizeof(addr), (char *)heartbeat, sizeof(long));
send(addr, toaddr, (char *)msg, msgsize);
}
void send(Address *myaddr, Address *toaddr, char *data, int size) {
en_msg *em;
static char temp[2048];
em = (en_msg *)malloc(sizeof(en_msg) + size);
em->size = size;
memcpy(&(em->from), &(myaddr), sizeof(em->from));
memcpy(&(em->to), &(toaddr), sizeof(em->from));
memcpy(em + 1, data, size);
cout<<em;
}
错误只是这一行:
分段错误(核心转储)
答案 0 :(得分:0)
1)正如退休忍者在评论中所说,main
的第一行必须像
MessageHdr *msg = new MessageHdr();
因为msg->msgType = JOINREQ;
会导致未分配的msg
错误。
2)由于像
这样的表达式,第一个修复无效 (char *)(msg+1)
此处msg
MessageHdr *
类型char *
在地址算术中用作 (char *)(msg+1) + 1
。我的意思是通过样式表达来计算地址是危险的
msg
虽然MessageHdr*
属于(msg+1)
类型,但MessageHdr
- 表示转换为下一个结构+1
以及转换为char*
后的MessageHdr
}意味着转移到一个字节。我个人无法理解逻辑,而enum
结构只有一个Address
字段,并且如此奇怪的地址操作,你试图适应long int
类(或memcpy
值的实例使用{{1}}到该结构。
<强>结论:强>
在操作中编写注释和使用清晰逻辑需要非常重要的程序重新设计。