我需要开发一个PHP服务器套接字和一个C客户端套接字,反之亦然。
我完全使用C语言中的TCP套接字及其概念。
我被困在最后一件事上。
我能够从C客户端套接字发送整个结构,如下所示
typedef struct _test {
char str[32];
char c;
int i;
float f;
}test;
//Some Coding ...
memset(&t,'\0',sizeof(test));
strcpy(t.str,"Sunny"); //String
t.c = 'M'; //Char
t.i = 26; //Integer
t.f = 98.8; //Float
//Send test STRUCT to server
if(send(sockfd,(void *)&t,sizeof(t),0) < 0)
{
perror("Send failed ");
exit(0);
}
//一些编码......
我在PHP服务器套接字上收到此结构,如下所示
...
$client = socket_accept($socket);
$input = socket_read($client, 1024);
$arr = unpack("Z32Str/a1Chr/iInt/fFlt", $input);
echo $arr['Str']; //Print String
echo $arr['Chr']; //Print Char
echo $arr['Int']; //Print Int
echo $arr['Flt']; //Print Float
...
我正在正确获取字符串和字符,但是我没有正确地获得Integer和Float,我确信它的网络可以承载字节顺序(小端,大端)问题。
即。我的整数value
为436207616
任何人都可以告诉我如何在PHP中对ntohl和ntohs进行等效的功能。
P.S。 : - 非常新的PHP ...请帮助
答案 0 :(得分:-1)
我已经在C中禁用了结构填充,如下所示,它起作用.....
如何禁用结构填充?如下 .... 以下是在C中使用pragma禁用结构填充的方法。
#pragma pack(push, 1)
//Define your structure here
#pragma pack(pop)
//Structure padding is re enabled.
#pragma pack(push,1)
typedef struct _test {
char str[32];
char c;
int i;
float f;
}test;
#pragma pack(pop)
或者:
我在C中保持填充并在php端执行以下操作,并且它有效....
$arr = unpack("Z32Str/z4Chr/iInt/fFlt", $input);