我在编写networking软件时面临一些问题。 当我尝试发送或接收包含8字节数据types的结构时,下一个发送或接收的结构会受到某种程度的影响。 我有几件事情,但首先我想在deBUGging之前确认一件事情。 我在64位x-86系统上使用32位Ubuntu 11.04(愚蠢的我)。 这是否与字节alignment问题有关?
我正在开发一个控制器来与Open Flow开关进行通信。 openflow协议定义了基于哪些交换机构build的一组规格。 问题是当我尝试与交换机进行通信时,一切正常,直到我发送或接收包含64位datetypes(uint64_t)的结构。 用于发送和接收function的特定结构是
estruct ofp_header { uint8_t version; /* OFP_VERSION. */ uint8_t type; /* One of the OFPT_ constants. */ uint16_t length; /* Length including this ofp_header. */ uint32_t xID; /* Transaction ID associated with this packet. ReplIEs use the same ID as was in the request to facilitate pairing. */}; assert(sizeof(struct ofp_header) == 8); /* Switch features. */ struct ofp_switch_features { struct ofp_header header; uint64_t datapath_ID; /* Datapath unique ID. The lower 48-bits are for a MAC address,while the upper 16-bits are implementer-defined. */ uint32_t n_buffers; /* Max packets buffered at once. */ uint8_t n_tables; /* Number of tables supported by datapath. */ uint8_t pad[3]; /* Align to 64-bits. */ /* Features. */ /* Bitmap of support "ofp_capabilitIEs". */ uint32_t capabilitIEs; /* Bitmap of supported "ofp_action_type"s. */ uint32_t actions; /* Port info.*/ struct ofp_phy_port ports[0]; /* Port deFinitions. The number of ports is inferred from the length fIEld in the header. */ }; assert(sizeof(struct ofp_switch_features) == 32);
问题是当我使用任何其他数据types小于64位的结构进行通信时,一切正常。 当我收到function回复它显示正确的值,但之后,如果我收到任何其他结构它显示垃圾值。 即使我收到function回复我得到垃圾值。 简而言之,如果在代码的任何一点我收到的function请求或规格中定义的数据types为64位的任何其他结构,下一个结构会收到垃圾值。 用于发送和接收function请求的代码如下
////// features request and reply //////////// ofp_header features_req; features_req.version=OFP_VERSION; features_req.type=OFPT_FEATURES_REQUEST; features_req.length= htons(sizeof features_req); features_req.xID = htonl(rcv_hello.xID); if (send(connected,&features_req,sizeof(features_req),0)==-1) { printf("Error in sending messagen"); exit(-1); } printf("features req sent!n"); ofp_switch_features features_rep={0}; if (recv(connected,&features_rep,sizeof(features_rep),0)==-1) { printf("Error in receiving messagen"); exit(-1); } printf("message type : %dn",features_rep.header.type); printf("version : %dn",features_rep.header.version); printf("message length: %dn",ntohs(features_rep.header.length)); printf("xID : %dn",ntohl(features_rep.header.xID)); printf("buffers: %dn",ntohl(features_rep.n_buffers)); printf("tables: %dn",features_rep.n_tables);
谢谢,阿卜杜拉
multithreading文件传输与套接字
OS X getsockopt:不是SO_PROTOCol
为什么gethostbyname和gethostbyaddr被认为是过时的?
为什么不能将linux服务绑定到环回?
linux套接字内核缓冲区是否交换到磁盘?
套接字错误:连接被拒绝 – 我在做什么错?
有没有办法让UDP .net套接字在套接字closures时释放绑定端口?
EAGAIN错误接受阻塞套接字
在Python 3中给出一个套接字和inode的进程ID
仅启用来自指定IP地址的传入连接
在发送它们之前将你的结构转换成一个字符数组 – 这是调用序列化
使用函数系列等来确保整数按网络顺序发送。 节省各种机器的endians麻烦
一个接收端读取字节并重建结构。
这将确保你不会有任何麻烦。
我得到了Daniweb.com的帮助,所有的荣誉都归功于一个拥有尼克松(nickz)的家伙。 他的回答是 ,我引用:
这个问题与64位类型无关。 你读的值不是垃圾,而是非常有价值的端口定义:
struct ofp_phy_port ports[0]; /* Port deFinitions. The number of ports is inferred from the length fIEld in the header. */
这意味着,一旦你
recv(connected,0)
你需要检查features_rep.header.length,找出p_phy_port后面有多少个结构,为它们分配内存并读取这些数据。
我这样做,并感谢他,我的问题解决了,一切顺利:)对于每个人回答。 欢呼:)
你甚至可以考虑使用序列化技术:也许JsON , XDR , YAML可能是相关的。 或像s11n , jansson等图书馆
这是什么是想要的
features_req.version=OFP_VERSION; features_req.type=OFPT_FEATURES_REQUEST; features_req.length= htons(sizeof features_req); features_req.xID = htonl(rcv_hello.xID); char data[8]; data[0] = features_req.version; data[1] = features_req.type; memcpy(data + 2,&features_req.length,2); memcpy(data + 4,&features_req.xID,4); if (send(connected,data,8) ....
在收到结束
char data[8]; if (recv(conncted,8) ... features_req.version = data[0]; features_req.type = data[1]; memcpy(&features_req.length,data + 2,2); memcpy(&features_req.xID,data + 4,4); features_req.length = ntohs(features_req.length); features_req.xID= ntohl(features_req.xID);
1如果你坚持发送结构,你应该确保它们是字节对齐的。
为此,请使用像这样的编译pack :
#pragma pack(1) struct mystruct{ uint8_t myint8; uint16_t myint16; }; #pragma pack()
这样做可以确保此结构仅使用3个字节。
2为了从主机顺序转换64位值到网络顺序这篇文章阅读interessing: 是否有任何“标准”htonl样函数为64位整数在C + +? (不,它只以c ++开头,也以C结尾)
总结以上是内存溢出为你收集整理的字节分配全部内容,希望文章能够帮你解决字节分配所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)