我知道函数send()
通过winsocket的payoload是一个指向char数组的指针,我想用它来发送一组固定值,我想写这样的东西< / p>
send(socket, FIXED_VALUE_N, (int)strnlen(FIXED_VALUE), 0);
同时,对于可读性和manteinance设置这对夫妇(名字,价值)的方式或类似(认为它是伪代码)会很舒适:
FIXED_VALUE_1 <- 1
FIXED_VALUE_2 <- 2
FIXED_VALUE_3 <- 3
...
我可以用什么?我已经放弃了枚举,因为它们是整数,我认为浪费四个发送每个字节一个字节。另一种方法是定义一个宏,但我不能为一个字节而不仅仅是一个字符串定义一个宏,因为我想发送'27',而不是'2','7'。
提前致谢。
答案 0 :(得分:4)
首先,请注意,如上所述,
send(socket, FIXED_VALUE_N, (int)strnlen(FIXED_VALUE_N), 0);
^^ //added to correct typo
FIXED_VALUE_N必须采用const char *的形式才能正确。并且,strnlen()
需要两个参数,(第二个是size_t number_of_elements
)。
编辑3 (解决最新评论问题)
如果您将FIXED_VALUE_N声明并填充为:
const char FIXED_VALUE_N[2];
FIXED_VALUE_N[0]=0x1B;
除了纠正第三个参数的语法......
send(socket, FIXED_VALUE_N, 1, 0); //hard-coded third argument for illustration
...它会起作用,因为你现在在第二个参数中传递一个指向const char(const char *
)的指针,并且遵守send()
原型的语法要求。
(结束编辑3)
考虑到这一点,您是否考虑将数据字符串连接成逗号分隔的组?这将允许发送多个值,并在接收端进行解析。例如:
#define MAX_SIZE 100 //pick a value that makes sense for your application, I randomly picked 100
char buffer[MAX_SIZE];
int len=0;
sprintf(buffer, "%d,%d,%d", FIXED_VALUE_1, FIXED_VALUE_2,FIXED_VALUE_3);
len = strlen(buffer); //****
send(socket, buffer, len + 1, 0); // strlen() does not include `\0` byte in its return
// value. Use `len +1` to make room for
// \0 terminator - added by the sprintf() function.
会发送"1,2,3"
关于你的陈述:因为我想发送'27'而不是'2','7'。
将逗号保留在格式sprintf()
语句之外,您发送的号码将是连续的。
sprintf(buffer, "%d%d%d", FIXED_VALUE_1, FIXED_VALUE_2,FIXED_VALUE_3);
^^^^^^
会发送"123"
编辑 (使用sprintf的返回填充len)
另外,正如@Jack所指出的那样:
您可以通过简单地设置len = sprintf(...)来保存一行代码,而不是使用strlen()
;在上面的行。 (请参阅上面代码段中的****
)
如果发生输出错误,sprintf()
将返回传输的字符数或负值。
(如果输出为负,则发生错误)
编辑2 (字节数据,根据您的评论)
如果要以最小(最有效)的形状因子发送数据,请使用字节数据。字节数据可以存储在char数组中:
char *byte_data=0;
byte_data = malloc(NUM_BYTES_RQD);//#define NUM_BYTES_RQD as needed,
//or pass in size info as an argument
//from calling function
//populate byte_data
for(i=0;<NUM_BYTES_RQD;i++)
{
byte_data[i]=<enter byte value here>
}
send(socket, byte_data, len, 0);
free(byte_data);
答案 1 :(得分:2)
您是否考虑过使用the X macro?
#define X(a, b) a,
#define FIXED_VALUES_TABLE
X(FIXED_VALUE_1, "1") \
X(FIXED_VALUE_2, "2") \
// ...
enum { FIXED_VALUES_TABLE };
#undef x
#define X(a, b) b,
const char *fixed_values_values[] = { FIXED_VALUES_TABLE };
#undef x
然后你就可以这样使用:
char *val = fixed_values_values[FIXED_VALUE_1];
char *va2 = fixed_values_values[FIXED_VALUE_2];
如果要连接它们,可以使用malloc()+strcat()
。