首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:发送RPC方法名+参数

C:发送RPC方法名+参数
EN

Stack Overflow用户
提问于 2015-05-01 14:38:23
回答 3查看 256关注 0票数 1

我希望发送一个RPC,在本例中是一个char数组,包含要执行的函数的名称和参数列表。

论点是国家统计局。

示例:

代码语言:javascript
复制
Function name: plus
argument 1: 19
argument 2: 23

我想要做的是,构建一个数组,其中包括每个数组,以便:

  1. 函数名大小的八进制值(在本例中,4)
  2. chars 'p', 'l', 'u', 's'
  3. 第一个参数大小的八进制值(在本例中为2,因为'1','9')
  4. 字符'1‘和字符'9’
  5. 第二个参数大小的八进制值(在本例中是2,因为'2','3')
  6. 字符'2‘和字符'3’

然后,我需要压缩

我已经有了一个编码到八进制值的函数:

代码语言:javascript
复制
int decimalToOctal(int n) {
  int rem, i = 1, octal = 0;
  while (n != 0) {
    rem = n % 8;
    n/=8;
    octal += rem*i;
    i *= 10;
  }

  return octal;
}

但是我不知道如何将八进制值和字符压缩到一个数组中,我需要通过套接字发送这个数组。或者我需要另一种类型的数组?谢谢你的暗示。

EN

回答 3

Stack Overflow用户

发布于 2015-05-01 17:32:58

听班吉的话,你会有创造力的。为什么不尝试使用位字段或将所有内容打包到char中。

代码语言:javascript
复制
struct packet 
{
    int num  : 3;
    int      : 1;
    int func : 4;
};

在这里,你得到了八进制数,一个填充位和4位来表示某种东西。当然,它不会是完整的ASCII表。自己做包。

票数 0
EN

Stack Overflow用户

发布于 2015-05-01 17:43:33

“如何通过网络发送信息并保持其兼容性”并不是一个新问题。您可能认为发送一些结构或数组是一个很好的想法,但许多编译器在每个成员之间添加额外的字节,以使多余的时间更快。因此,您可能希望以某种文本形式发送数据,并根据某些关键字天真地将其拆分。那么,如果其中一个关键字本身就是一个有效的参数,会发生什么呢?例如,您可能希望拆分找到字符串function:的文本。那么,如果发送类型为char[]和值I'm a math student and function:的参数,会发生什么情况?你完蛋了。

这就是我建议使用JSON或XML的原因(我会继续使用JSON,因为它更小、更易读)。这里有很多C库。您只需定义某种形式的JSON,客户机和服务器都可以解析和发送类似的任何东西。例如:

代码语言:javascript
复制
{
"function":"plus",
"arguments":[1,2]
}

许多低级开发人员可能不喜欢在C中使用javascript概念,但实际上,当您想到它时,这是一个非常聪明的解决方案。首先,明天您的客户端或服务器可以用不同的语言编写,然后用C编写,然后您就不能再发送任何结构了。每一种体面的语言都有JSON库。此外,JSON成为最流行的数据交换结构之一。

票数 0
EN

Stack Overflow用户

发布于 2015-05-01 18:01:53

正如前面的答案所提到的,您需要创建一个数据包来序列化并通过网络发送它。

因此,下面的示例适用于DGRAM套接字,但也会对流套接字进行一些更改。

第一步创建你自己的包。例:

代码语言:javascript
复制
 typedef struct messageInfo
 {
     char clientReq[MAX_LENGTH];
     u_int32_t arg;
     u_int32_t value;
     //maybe add arglist // maybe send less data by encoding 
     /* required in case of unreliable connection for end     packet***u_int16_t end;*** */ 
 }__attribute__ ((__packed__))info;  

第二步,通过套接字伪代码发送它。

代码语言:javascript
复制
fd = socket( family, TYPE, 0 ); //TYPE = SOCK_STREAM or SOCK_DGRAM
//bind locally
//update peer sock structure to sendto or write
//create header start
uint8_t *tBuf = malloc(sizeof (info)); 
//memset to zero
info *pHeader = (info *)tBuf;
pHeader->value = htonl(19); //local value to send
pHeader->clientReq  = "plus";
pheader->arg = htonl(23);
//create header end
//send to receiver
sendto(serverSock, tBuf, sizeof(info),0
                             ,(struct sockaddr *) &peerV4,
                             sizeof(peerV4));

第三步接收伪码

代码语言:javascript
复制
 //create fd and init
 //recvfrom allocate buffer to recv
 uint8_t *recvBuf = malloc(sizeof(info));
 info *pheader = (info *)recvBuf;
 int currLen = recvfrom( fd, recvBuf,
              sizeof(info),0,(struct sockaddr *)&peerV4,
                 &sockaddrLen);
  //error handling
  if(currLen == sizeof(info))
  {

       //close socket if end is specified in case of connection less protocol
       // strcpy to localRecv
       char *localRecv = malloc(MAX_LENGTH);
       strcpy (localRecv,pheader->clientReq);
       //do something with the values on the server like
       if (strcasecmp(localRecv,"plus")     == 0) //pseudo
            plus(ntohl(pheader->arg),ntohl(pheader->value));
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29988939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档