c - 如何将 send() 与整数一起使用

标签 c winapi winsock

我有以下代码:

int * buffer;
buffer = (int *) malloc((320*240)*sizeof(int));

用数据填充缓冲区后,我想使用UDP套接字发送它,但是目前我的以下send函数似乎只发送4个字节(数据)和不是 ((320*240)*sizeof(int)):

iError = send(MySock, (char *)(buffer) , sizeof(buffer), 0);

我在 send 函数的第二个和第三个字段上尝试了不同的组合,但它不起作用,我应该使用什么正确的语法?

顺便说一句,我必须将 buffer 定义为 int *,因为它被其他必须将其作为 int * 获取的库使用。

最佳答案

这是因为在您的 send() 调用中,您指定了 sizeof (buffer)。这是变量缓冲区的大小,也就是指针的大小,在你的系统上恰好是四个字节。它不是指针指向的 block 的大小,该信息不可用。

您必须指定 320 * 240 * sizeof *buffer 以获得正确的大小。当然,更好的方法是将其分解为一个变量:

int *buffer;
const size_t buffer_size = 320 * 240 * sizeof *buffer;

if( (buffer = malloc(buffer_size)) != NULL )
{
  /* ... fill buffer ... */
  send(MySock, buffer, buffer_size, 0);
}

无需转换,malloc() returns void * send() 接受它。

请注意,在 UDP might not work, due to IP fragmentation 上执行非常大的 send() .根据我的经验,最好使用许多小数据报来发送它。

关于c - 如何将 send() 与整数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14400419/

相关文章:

CreateThread x3000 返回标准输出句柄

c - 遍历堆栈

vb.net - 如何在 Windows 关机时正常关闭控制台应用程序

c++ - 我真的必须链接 Ws2_32.lib 吗?

c - 通过同一台机器上的 UDP 套接字发送数据是否可靠?

c++ - 获取 unicode 代码点的大写或小写(如 uint32_t)

c - CMake — C —多个源文件忽略页眉防护

c - 拦截到自定义 UDP 服务器的系统日志日志流量

c - 是否可以将命令行参数传递给 GNU LD 以创建一个部分、定义大小并将其放置在特定内存中?

c++ - Boost::asio winsock 和 winsock 2 兼容性问题