【问题标题】:error C2664: 'send' : cannot convert parameter 2 from 'ServerGreeting' to 'const char *'错误 C2664:“发送”:无法将参数 2 从“ServerGreeting”转换为“const char *”
【发布时间】:2015-05-10 15:23:26
【问题描述】:

我是 C++ 的初学者,我正在将 C 代码 (TWAMP RFC5357) 移植到一个新项目 (IPSLA RFC 6812) 中,我遇到了这个问题:

当我尝试使用函数 send 时,我看到错误“错误 C2664: 'send' : cannot convert parameter 2 from 'ServerGreeting' to 'const char *'” “No user-可以执行此转换的已定义转换运算符可用,否则无法调用该运算符。

所以,我搜索了这个,我发现了一些我不明白的答案。

下面是一些代码:

typedef struct server_greeting { UINT8 未使用[12]; UINT32 模式; UINT8 挑战[16]; UINT8 盐[16]; UINT32 计数; UINT8 MBZ[12]; } 服务器问候; struct active_session { int socket; // RequestSession req; }; struct client_info { int socket; sockaddr_in addr; int sess_no; struct active_session sessions[MAX_SESSIONS_PER_CLIENT]; timeval shutdown_time; }; static void cleanup_client (struct client_info *client) { fprintf (stderr,"Cleanup client %s\n", inet_ntoa(client->addr.sin_addr)); FD_CLR(client->socket,&read_fds); closesocket(client->socket); used_sockets--; int i; for (i = 0; i < client->sess_no; i++) /* If socket is -1 the session has already been closed */ if (client->sessions[i].socket > 0) { FD_CLR(client->sessions[i].socket, &read_fds); closesocket(client->sessions[i].socket); client->sessions[i].socket = -1; used_sockets--; } memset(client, 0, sizeof(struct client_info)); //client->status = kOffline; } static int send_greeting(UINT8 mode_mask, struct client_info *client) { int socket = client->socket; int i; ServerGreeting greet; memset(&greet, 0, sizeof(greet)); greet.Modes = 1 & mode_mask; for (i = 0; i < 16; i++) greet.Challenge[i] = rand() % 16; for (i = 0; i < 16; i++) greet.Salt[i] = rand() % 16; greet.Count = (1 << 12); int rv = send (socket, greet, sizeof(greet), 0); if (rv < 0) { fprintf(stderr, "[%s] ", inet_ntoa(client->addr.sin_addr)); perror("Failed to send ServerGreeting message"); cleanup_client(client); } else { printf("Sent ServerGreeting message to %s. Result %d\n", inet_ntoa(client->addr.sin_addr), rv); } return rv; }

你能帮我解决这个问题吗?谢谢

【问题讨论】:

  • 我认为这里唯一的选择是强制转换:int rv = send (socket, reinterpret_cast&lt;const char*&gt;(&amp;greet), sizeof(greet), 0);
  • 嘿!我已经更改了代码,并且工作正常。我不知道如何使用重新解释。所以 reinterpred_cast 解决了这个问题。谢谢。
  • user1320881 已经帮助了我。解决方案是使用 reinterpret_cast。
  • 您引用的 RFC 表明您发送的结构应包含网络字节顺序(通常为大端)的元素。这意味着,如果希望您的解决方案正确,您需要在考虑字节序的情况下填充问候结构。

标签: c++ struct c2664


【解决方案1】:

send function 将const char* 指向缓冲区的指针作为其第二个参数,因此您需要使用适当的强制转换传递struct 的地址,

int rv = send (socket, (const char*)&greet, sizeof(greet), 0);

编译器告诉你它不能执行从你试图传递的结构到它期望的指针类型的转换,你应该相信它。

【讨论】:

  • vsoftco - 问题已由 user1320881 解决,其中建议使用 reinterpret_cast 函数。谢谢。
  • @vsoftco 这将是一个更好的答案,除了原始错误消息清楚地表明参数类型是const char *,因此需要强制转换。虽然 OP 没有这么明确地说,但我相信上下文是 Windows,send 的定义不太优雅:msdn.microsoft.com/en-us/library/windows/desktop/…
  • @Alan Stokes 哦,对不起,我收回了......问题是你传递的指针的类型,你是对的。谢谢,编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多