我希望发送一个RPC,在本例中是一个char数组,包含要执行的函数的名称和参数列表。
论点是国家统计局。
示例:
Function name: plus
argument 1: 19
argument 2: 23我想要做的是,构建一个数组,其中包括每个数组,以便:
'p', 'l', 'u', 's'然后,我需要压缩
我已经有了一个编码到八进制值的函数:
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;
}但是我不知道如何将八进制值和字符压缩到一个数组中,我需要通过套接字发送这个数组。或者我需要另一种类型的数组?谢谢你的暗示。
发布于 2015-05-01 17:32:58
听班吉的话,你会有创造力的。为什么不尝试使用位字段或将所有内容打包到char中。
struct packet
{
int num : 3;
int : 1;
int func : 4;
};在这里,你得到了八进制数,一个填充位和4位来表示某种东西。当然,它不会是完整的ASCII表。自己做包。
发布于 2015-05-01 17:43:33
“如何通过网络发送信息并保持其兼容性”并不是一个新问题。您可能认为发送一些结构或数组是一个很好的想法,但许多编译器在每个成员之间添加额外的字节,以使多余的时间更快。因此,您可能希望以某种文本形式发送数据,并根据某些关键字天真地将其拆分。那么,如果其中一个关键字本身就是一个有效的参数,会发生什么呢?例如,您可能希望拆分找到字符串function:的文本。那么,如果发送类型为char[]和值I'm a math student and function:的参数,会发生什么情况?你完蛋了。
这就是我建议使用JSON或XML的原因(我会继续使用JSON,因为它更小、更易读)。这里有很多C库。您只需定义某种形式的JSON,客户机和服务器都可以解析和发送类似的任何东西。例如:
{
"function":"plus",
"arguments":[1,2]
}许多低级开发人员可能不喜欢在C中使用javascript概念,但实际上,当您想到它时,这是一个非常聪明的解决方案。首先,明天您的客户端或服务器可以用不同的语言编写,然后用C编写,然后您就不能再发送任何结构了。每一种体面的语言都有JSON库。此外,JSON成为最流行的数据交换结构之一。
发布于 2015-05-01 18:01:53
正如前面的答案所提到的,您需要创建一个数据包来序列化并通过网络发送它。
因此,下面的示例适用于DGRAM套接字,但也会对流套接字进行一些更改。
第一步创建你自己的包。例:
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; 第二步,通过套接字伪代码发送它。
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));第三步接收伪码
//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));
}https://stackoverflow.com/questions/29988939
复制相似问题