❶ 怎么用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)) );
{
...
}