我想用MS函数发送数据。
我没有找到除了const char *之外发送其他类型数据的示例。 我试图发送一个int或其他,但我失败了。
WSASend()和send()这两个函数只接受Char *参数。
我该怎么办?
由于
答案 0 :(得分:1)
它只是一个指向缓冲区的指针,这个缓冲区可能包含你想要的任何内容。
这个char指针实际上是一个字节数组的地址,这个函数也需要一个长度参数。
整数是2/4(短/长)字节值,
然后,如果你想发送一个整数变量(例如),你必须传递它的地址及其长度。
WSASend和send是发送内存块的简单函数。
我假设您在谈论C,您必须了解C的char变量是字节 - 8位块,char变量包含0到255之间的任何值。
指向char var的指针是一个字节的地址(可能是字节数组的第一个单元格)。
我认为这让你感到困惑。
我希望你明白。
答案 1 :(得分:1)
const char *参数表示该函数正在使用指向字节的指针。 Witch似乎是原始socket api设计师迂腐的结果--C有一个泛型类型来处理任何类型的指针而没有显式的转换:void *。
你可以为这样的发送制作一个方便的包装器 - 这将允许你发送任何(连续的)你可以指向的东西:
int MySend(SOCKET s, const void* buf, int len,int flags)
{
return send(s,(const char*)buf,len,flags);
}
使用void *代替char *实际上使api更安全,因为它现在可以检测到你做什么愚蠢的事情:
int x=0x1234;
send(s,(const char*)x,sizeof(x),0); // looks right, but is wrong.
mysend(s,x,sizeof(x),0); // this version correctly fails
mysend(s,&x,sizeof(x),0); // correct - pass a pointer to the buffer to send.
WSASend制作一个方便的工具有点棘手,因为你必须传递一个包含char *的结构数组 - 但同样它是一个用const void *来定义一个等效结构的例子。 const char *的位置,然后将数据结构转换为方便包装器中的WSA类型。一次正确,并且程序的其余部分变得更容易确定正确,因为你不需要在任何地方隐藏潜在的错误。