WSASend:发送int或struct

时间:2010-11-24 22:17:07

标签: winapi sockets

我想用MS函数发送数据。

我没有找到除了const char *之外发送其他类型数据的示例。 我试图发送一个int或其他,但我失败了。

WSASend()和send()这两个函数只接受Char *参数。

我该怎么办?

由于

2 个答案:

答案 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类型。一次正确,并且程序的其余部分变得更容易确定正确,因为你不需要在任何地方隐藏潜在的错误。