一、發(fā)送最普通的 char ?類型,例:
Server:?
? ? ? ? char buf[buffsize];
????????bzero(buf,buffsize);
? ? ? ? send(socketfd,buf,sizeof(buf),0);
Client:
? ? char recv_buf[buffsize];
? ? recv(clientfd,rec_buf,buffsize,0);
二、發(fā)送結(jié)構(gòu)體數(shù)據(jù)
由于結(jié)構(gòu)體對(duì)象在內(nèi)存中分配的空間都是連續(xù)的,所以可以將整個(gè)結(jié)構(gòu)體直接轉(zhuǎn)化成字符串發(fā)送,到了客戶端接收方再將這個(gè)字符串還原成結(jié)構(gòu)體纬凤,所以本質(zhì)可以理解為 發(fā)送char類型。CPU訪問內(nèi)存的時(shí)候撩嚼,對(duì)訪問地址有對(duì)齊的要求停士,一般為2的冪次方挖帘。結(jié)構(gòu)體使用時(shí)要注意內(nèi)存對(duì)齊
例:
Sever:
char?temp[100];?//傳送的字符串
struct?person p1;?//聲明一個(gè)需要傳送的結(jié)構(gòu)體
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
memset(temp,0,sizeof(temp));?// 對(duì)該內(nèi)存段進(jìn)行清
memcpy(temp,&p1,sizeof(person));?// 把這個(gè)結(jié)構(gòu)體中的信息從內(nèi)存中讀入到字符串temp中
send(sock,temp,sizeof(person),0);//或:
send(sock,(char*)&p1,sizeof(person),0);
Client:
char?temp[100];???
struct?person p2;?
memset(temp, 0,?sizeof(temp));
recv(clientSocket, temp, 101, 0);
memcpy(&p2,temp,sizeof(person));?//或者
recv(clientSocket, (char*)&p2,?sizeof(person),0);
三、發(fā)送類對(duì)象(發(fā)送對(duì)象的地址)
例:
Server:
class Data
{
public:
int mout;
int day;
int year;
};
Data a={9,10,2010};
char *buf = (char*)(&a);//把對(duì)象a的地址傳過去
int len = sizeof(class data);
send(SOCKET s,char* buf,int len);
Client:
class Data
{
public:
?int mout;
int day;
int year;
}
Data b;
recv_loop(SOCKET s,(char*)(&b),sizeof(class data));
Socket是字節(jié)流恋技,問題是接收到字節(jié)流重建對(duì)象的過程拇舀,可能在內(nèi)存中,同一個(gè)對(duì)象蜻底,不同的操作系統(tǒng)骄崩,不同的編譯參數(shù),都會(huì)造成內(nèi)存中數(shù)據(jù)的不同薄辅〉罄担考慮類中含有 指針、引用长搀、vector情況,需要做好流化處理宇弛?建議使用?protobuf二進(jìn)制流,無關(guān)平臺(tái)和語(yǔ)言
四源请、使用 protobuf(具體使用跳轉(zhuǎn))
1.為什么使用protobuf枪芒?數(shù)據(jù)需要在不同的平臺(tái),不同的程序中進(jìn)行傳輸和使用谁尸,比如server使用c++舅踪,而Client使用腳本(lua,js),或者C++程序和JAVA程序的通信,這時(shí)當(dāng)產(chǎn)生一個(gè)消息數(shù)據(jù)時(shí)良蛮,則需要在不同的語(yǔ)言編寫的不同的程序中進(jìn)行操作抽碌,這就需要設(shè)計(jì)一種消息格式,常用的就有json和xml决瞳,protobuf出現(xiàn)的較晚货徙。?
2.protobuf將數(shù)據(jù)序列化為二進(jìn)制之后,占用的空間相當(dāng)小皮胡,基本僅保留了數(shù)據(jù)部分痴颊,傳輸效率高,而xml和json會(huì)附帶消息結(jié)構(gòu)在數(shù)據(jù)中屡贺。?一條消息數(shù)據(jù)蠢棱,用protobuf序列化后的大小是json的10分之一,是xml格式的20分之一甩栈,但是性能卻是它們的5~100倍泻仙。