❶ 怎麼用socket傳送復雜結構體
將結構體轉換成char*然後再發送。注意服務端的結構體和客戶端結構體要嚴格一致。
定長的簡單,直接轉成char*搞定。
如果結構體是變長的,要用到一些trick。
最簡單的就是零長度的數組。
struct test
{
int aint;
char buff[0];
}
分配內存的時候 test pTest = new(sizeof(test) + n);
然後發送的長度就是 sizeof(test) + n
然後轉換成char *發送過去就是了。
❷ 結構體數組如何用socket發送與接收
需要將這個結構體先存進一個線性的內存空間。先定義一個char* p,然後動態開辟空間malloc,大小是sizeof(stu),用函數memcpy,將(void*)&stu拷貝進你剛剛定義的p裡面。這樣就能夠寫進socket的緩沖區裡面了。
❸ php 怎麼用socket 怎麼向其他伺服器發送結構體數據 - PHP進階討論
3#
那類似於c++中這樣子的結構體要怎麼實現啊?[php]typedef
struct
Msg{typedef
BYTE
Type;typedef
short
SubType;enum{??HeadRen
=
10,??HeadLen
=
sizeof(unsigned
short)
+
HeadRen
*
sizeof(char),??FarTypeLen
=
sizeof(Type),??SubTypeLen
=
sizeof(SubType),??TypeLen
=
FarTypeLen
+
SubTypeLen,??MaxSize
=
4
*
1024,??MsgBodyLen
=
MaxSize
-
HeadLen
-
TypeLen};struct
MsgHeader{??unsigned
short
msgLen;??char
Rendance[HeadRen];??MsgHeader()??{?
?memset(this,
0,
sizeof(*this));??//初始化清零??}??void
FillInHeaderV1(int
msgType,
int
bodyLen,
int
isFinish
=
1)??{?
?int
count
=
Logger::snprintf((char*)this,
HeadLen
+
TypeLen,
\"%d
%d
%d
0\",
msgType,
bodyLen,
isFinish);?
?while(count
<
HeadLen
+
TypeLen)?
?{?
?
((char*)(this))[count++]
=
\'0\';?
?}????}}MsgHead;struct
MsgCont{??Type
type;??SubType
subType;??char
msgBody[MsgBodyLen];}MsgContent;}NetMessage;[/php]
❹ socket怎麼傳遞一個結構體數組,數組中元素為結構體。
要首先理解傳輸原理:
socket其實是位元組流傳輸的,就是說傳輸的數據本身是無結構的,所以收、發雙方要約束好傳輸的內容結構。
發送方:ssize_t send(int sockfd, const void *buf, size_t len, int flags); 要將要傳送的結構體存儲在buf里,以首地址指針的形式發送,並且指定好buff的長度。所以一般要將某結構體指針強制轉換成void*格式發送。
接收方:ssize_t recv(int sockfd, void *buf, size_t len, int flags); 收到數據後,buf是首地址,所以要強制轉換成約定好的結構體,若結構體名為mystruct, 則(mystruct*) buf,這樣接收方就可以使用這個數據啦。
========================================================================
❺ 用socket發送結構體 卻只收到其中一個數據
這個問題在於Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
改為:Ret = send(CientSocket, SendBuffer, sizeof(info), 0);
❻ php如何處理socket發過來的消息包(消息包包括消息頭、消息體、校驗和)
簡單說兩句,pack和unpack方法可以把二進制的數據變成人類認識的樣子
其實結構體在內存中的樣子就是分段pack出來之後連接(就是php那個 . )到一起
按照結構體定義知道長度之後,一段一段截取出來unpack
發的時候一段一段pack了連一塊兒
需要注意某些長度不整(譬如char*)的欄位,可能涉及到對齊問題(這個可能還跟c的編譯器版本和編譯參數有關)
❼ C++有結構體struct Test{WCHAR swzText[32];},PHP如何用socket發送數據給C++服務端,而且不亂碼
要把PHP和C++的socket編碼統一才可以的
我這里有個VB和PHP做socket的代碼你可以參考下 我之前也是一直亂碼 原來就是編碼導致的
對了 我用的是tinkphp框架
❽ socket套接字,如何發送一個結構體
windows
下先是調用wsastartup()初始化套接子環境,並且在套接字關閉的時候清理內存。再調用socket(af_inet,socket_stream或socet_datagram,0)函數就可以創建一個套接字了,調用成功函數返回一個socket句柄。linux下只要調用socket()函數就可以創建套接字了。
❾ socket發送接收結構體
最主要的接收處理你沒有說明是怎麼做的阿?
sRecv 是怎麼接收的?
真的接收成功了嗎?
/////////////////////////////////
主要問題是你的Client 發送問題。
結構沒有發送出去。
strData s;
s.iNum = 144;
sprintf(s.cName,"卡卡西");
s.uChinese = 80;
s.uMath = 89;
s.uEnglish = 70;
CString sSend;
sSend.Format("%s",(char*)&s);
這里s結構在內存中是
0x90 0x00 0x00 0x00 0x50 ....
你的sSend通過Format是得不到你想要的數據。
CString 的Format 時遇到'\0'會截斷。所以實際中sSend中只有一個 0x90字元。
修改SendData函數
BOOL CClientDlg::SendData(char* sSend,int iSendLen,const unsigned int uPort )
然後調用時
if(!SendData( (char*)&s,sizeof(strData)) );
{
...
}