php通过socket编程传递c结构数据

标签 php c linux sockets

如何制作一个需要执行 socket_sendto 到具有以下结构的 linux C 套接字服务器的 php 套接字客户端

typedef struct
{
  UI2             todo;   
  char            rz[LNG_RZ + 1]; 
  char            saId[LNG_SAT_ID + 1]; 
  char            user[LNG_USER + 1]; 
  char            lang[LANGLEN + 1]; 
  SI4             result;       
  UI4             socket;  
  char            text[LNG_ALLG + 1]; 
  char            filename[MAX_PATHLEN];
}  dmsAuf_Head;        

显然,PHP 不支持 struct 如何使用 php 将 c 数据传递给套接字

我知道有一个技巧可以使用以下方法创建 c struct 对象:

class dmsAuf_Head {
  public            todo;            
  public            rz    
  public            saId    
  public            user    
  public            lang    
  public            result;                         
  public            socket;        
  public            text   
  public            filename 
}

$obj = new dmsAuf_Head();

但这不会处理属性的大小吗?有什么推荐吗?


如何在发送前序列化所有内容???

根据 c 套接字服务器的开发人员的建议,他们使用以下 c 代码将值发送到 c 套接字服务器:

 rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0);

那么我如何使用 php 发送 dms_aufHead 数据呢?


根据 c 套接字服务器的开发人员的建议,他们使用以下 c 代码将值发送到 c 套接字服务器:

rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0);

那么我如何使用 php 发送 dms_aufHead 数据呢?

如果(例如)$rz 只有 3 个字符(对于这种情况)而不是所需长度的 13 个字符怎么办?我应该为 PHP 输出什么?

最佳答案

您需要以正确的顺序fwrite 数据。 pack 函数会很有用。

http://us2.php.net/pack

fwrite($sock, pack('v', 0x1234)); // send a 16 bit integer

当然,您必须注意 C 结构的构建方式(填充等)、目标机器期望的字节顺序等等。

正因为如此,对于两个系统来说,简单地按顺序读取/写入所需数据并手动(逐个字段)填充结构通常更好,而不是尝试将结构本身作为一个大文件来读取/写入堵塞。在 PHP 方面,它可能看起来像:

class dmsAuf_Head {
  public            $todo;            
  public            $rz;    
  public            $saId;    
  public            $user;    
  public            $lang;    
  public            $result;                         
  public            $socket;        
  public            $text;   
  public            $filename; 

  public function send($sock)
  {
    fwrite($sock, pack('v', $this->todo));
    // .. fwrite the rest
  }
}

$foo = new dmsAuf_Head();
$foo->send($sock);

(请注意,如果您使用多个参数,您可以构建一个打包的字符串并一次性发送。)

关于php通过socket编程传递c结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3993762/

相关文章:

c - 有没有办法验证我的程序没有内存泄漏?

php - 停用和卸载 Zend Opcode 缓存

c++ - 如何编写可以在 Linux 和 Windows 中轻松编译的 C++ 程序?

php - Symfony2 中的 CollectionType 验证

php - __autoload 在使用 PHPUnit 进行测试时不受尊重

c - 在内核和用户端保持 Netlink Socket 打开

c - 如何在当前语言环境下使用 strerror_l?

php - 使用 php 错误更新 sql 表

php - 如何获取链接的名称?

c - 如何在文件中间插入和删除一些字符?