PC跟ppc的开发板之间,tcp发包测试大小端格式

来源:互联网 发布:做java程序员 编辑:程序博客网 时间:2024/05/21 17:40

PC端是x86,小端模式,开发板是power PC,大端模式。

int test_endian(){int sock;struct sockaddr_in  serverAddr;rtp_hdr_t msg;int sockAddrSize = sizeof(struct sockaddr_in);sock = socket(AF_INET,SOCK_STREAM,0);if(sock==ERROR){perror("socket/n");return;}sockAddrSize = sizeof(struct sockaddr_in);bzero((char*)&serverAddr,sockAddrSize);serverAddr.sin_family = AF_INET;serverAddr.sin_len = (u_char)sockAddrSize;serverAddr.sin_port = htons(6000);if(ERROR==(serverAddr.sin_addr.s_addr = inet_addr("10.18.34.169"))){perror("inet_addr/n");close(sock);return;}printf("connect...../n");if(connect(sock,(struct sockaddr*)&serverAddr,sockAddrSize)==ERROR){perror("error connect/n");close(sock);return;}printf("sizeof(msg) = %d/n",sizeof(msg));recv(sock,(char*)&msg,sizeof(msg),0);printf("msg = 0x%x/n",*(int*)&msg);printf("msg.cc = %x/nmsg.extbit=%o/nmsg.padbit=%o/nmsg.version=%o/nmsg.markbit=%o/nmsg.paytype=%x/n",msg.cc,msg.extbit,msg.padbit,msg.version,msg.markbit,msg.paytype);close(sock);}VC 6.0下的#include "stdafx.h"#include #include #include #include #define uint16_t short int#define u_int16 short int#define u_int32 inttypedef struct {       #ifdef RTP_BIG_ENDIANuint16_t version:2;uint16_t padbit:1;uint16_t extbit:1;uint16_t cc:4;uint16_t markbit:1;uint16_t paytype:7;#else // little endianu_int16 cc:4;u_int16 extbit:1;u_int16 padbit:1;u_int16 version:2;u_int16 paytype:7;u_int16 markbit:1;#endif  //char pad;//char pad1;} rtp_hdr_t;int main(void){#if 1WORD wVersionRequested;WSADATA wsaData;int err;rtp_hdr_t msg;wVersionRequested = MAKEWORD(1,1);printf("sizeof(msg) = %d/n",sizeof(msg));err = WSAStartup(wVersionRequested,&wsaData);if (err != 0){return -1;}if (LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1){WSACleanup();return -1;}SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));listen(sockSrv,5);SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);char sendBuf[100];printf("welcome %s/n",inet_ntoa(addrClient.sin_addr));printf("send msg''''''''''''''''''''''''/n");msg.cc = 0x4;msg.extbit = 0x1;msg.markbit = 0x0;msg.padbit =0x1;msg.version = 0x1;msg.paytype = 0x9;//msg.pad = 0x1;//msg.pad1 = 0x1;printf("msg = 0x%02x/n",*(int*)&msg);send(sockConn,(char*)&msg,sizeof(msg),0);closesocket(sockConn);#endifreturn 0;}

一直不明白为什么不设置成如下格式:

typedef struct {       #ifdef RTP_BIG_ENDIANuint16_t version:2;uint16_t padbit:1;uint16_t extbit:1;uint16_t cc:4;uint16_t markbit:1;uint16_t paytype:7;#else // little endianu_int16 paytype:7;u_int16 markbit:1;u_int16 cc:4;u_int16 extbit:1;u_int16 padbit:1;u_int16 version:2;#endif  //char pad;//char pad1;} rtp_hdr_t;
原创粉丝点击