【问题标题】:How to set a socket option in C++ using setsockopt如何使用 setsockopt 在 C++ 中设置套接字选项
【发布时间】:2021-02-19 20:46:39
【问题描述】:

我的代码还是有问题。

if (argc > 0) {
int route (argc);//[argc+1]
((char*) route)[0] = 1;
((char*) route)[1] = 2;//131
((char*) route)[2] = 3 + argc * 4;
((char*) route)[3] = 4;
for (int i = 0; i < argc; i++) {
    route = inet_addr(argv[i]);
}

if (setsockopt(_socket.native_handle(), IPPROTO_IP, IP_OPTIONS, route, (argc + 1) * 4) < 0) {
    perror("can't set socket option");
}
}

这是其中的一部分,不断收到此错误 C2664: cannot convert parameter 4 from 'int' to 'const char *'

【问题讨论】:

  • 你的意思是指argv而不是argc吗? argc 实际上是一个整数值,用于指定 main() 函数的现有字符串参数的数量。
  • Anton,这段代码有很多问题,我建议你找一些BEGINNER教程。 (对不起)
  • @πάνταῥεῖ 好吧,我是这方面的业余爱好者,所以我有点困惑。如果我在那里引用 argv (argv+1) - 它给了我另一个错误,我应该引用 ro 算术类型和 bla bla bla
  • @Amit haha​​ 确定!我知道..没有人能指出这些问题在哪里
  • @AntonYatsushko “没有人能指出这些问题在哪里” 好吧,您的代码远没有做任何有意义的事情,例如int route (argc)。如前所述,argc 通常是传递给main() 的参数数量,除非您在此处以完全不同的方式使用该符号名称。那我们应该怎么回答呢?

标签: c++ visual-studio-2012 setsockopt


【解决方案1】:

Microsoft 的setsockopt() 实现有一个const char* 用于第四个选项。 POSIX usually has 一个 const void*。它必须指向一个包含值的缓冲区。最后一个参数是缓冲区的大小(以字节为单位)。

所以是这样的:

setsockopt(
    _socket.native_handle(), IPPROTO_IP, IP_OPTIONS,
    reinterpret_cast<char*>(&route), sizeof(int));

我对套接字的了解还不够,无法告诉您您传递的内容是否真的有意义。 Here's the documentation on MSDN 用于 IP_OPTIONS。

【讨论】:

  • 非常感谢您的帮助! @isanae
  • 但我必须承认,调用setsockopt()之前的所有代码都是没有意义的。
  • 是的..我也是这么想的..@isanae
【解决方案2】:
timeout = send_timeout_seconds * 1000;

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2018-08-09
  • 1970-01-01
  • 2011-07-19
  • 2014-12-01
  • 2014-10-19
相关资源
最近更新 更多