-8

这是在linux上顺便说一句...

我从我的代码中收到此错误

m-server.cpp: In function âvoid* SocketHandler(void*)â:
m-server.cpp:187: error: invalid conversion from âcharâ to âconst void*â
m-server.cpp:187: error:   initializing argument 2 of âssize_t send(int, const void*, size_t, int)â

给出错误的部分:

char welcomemsg;

cout << "Set the welcome message: ";
cin >> welcomemsg;

//send initial welcome data || msg & src
send(*csock, welcomemsg, sizeof(welcomemsg), 0); //this is line 187

更新

我改变了主意,而不是 cIN 然后 msg,我只想像下面的代码一样设置它。

我从我的代码中收到此错误

m-server.cpp: In function âvoid* SocketHandler(void*)â:
m-server.cpp:181: error: invalid conversion from âconst char*â to âcharâ
m-server.cpp:230: error: jump to label âFINISHâ
m-server.cpp:177: error:   from here
m-server.cpp:181: error:   crosses initialization of âchar welcomemsgâ
m-server.cpp:230: error: jump to label âFINISHâ
m-server.cpp:161: error:   from here
m-server.cpp:181: error:   crosses initialization of âchar welcomemsgâ
m-server.cpp:230: error: jump to label âFINISHâ
m-server.cpp:149: error:   from here
m-server.cpp:181: error:   crosses initialization of âchar welcomemsgâ

给出错误的部分:

char welcomemsg = "@hello_! bro?"; //can allow symbols? 

//send initial welcome data || msg & src
send(*csock, (void *)&welcomemsg, sizeof(welcomemsg), 0);

我是 C++ 新手,这里有什么问题?怎么修?其背后的原因是什么?


更新

我将其更改为此服务器后,服务器没有任何错误。

char *welcomemsg = "hello";

//send initial welcome data || msg & src
send(*csock, welcomemsg, sizeof(welcomemsg), 0);

但是现在客户端在收到欢迎消息时崩溃了。为什么?
这是我与服务器一起使用的代码,客户端正在阅读欢迎消息。

send(*csock, "Hello_Word", 10, 0); //was a working code

更新

我已经检查并且客户端在 recv() 上崩溃了
此代码与所有建议有什么区别?为什么这段代码在没有崩溃客户端的情况下运行良好?

send(*csock, "Temporarily Offline_Server will open sockets on Jan. 14, 2013", 61, 0); //was a working code

更新

我的 recv() 代码:

response = "";
resp_leng= BUFFERSIZE;
while (resp_leng == BUFFERSIZE)
{
    resp_leng= recv(sock, (char*)&buffer, BUFFERSIZE, 0);
    if (resp_leng>0)
        response+= string(buffer).substr(0,resp_leng);
}
4

4 回答 4

2

尽管在其他答案中有所说明,但[const] void *完全没有必要显式转换为类型。但是,welcomemsg确实需要获取对象的地址

send(*csock, &welcomemsg, sizeof welcomemsg, 0);

以上将修复编译器错误。

但是,我猜这个问题实际上具有不同的性质。您是否打算让您的“欢迎信息”仅包含一个字符?您的welcomemsg变量被声明为单个字符。如果您希望它比一个字符更长,那么您应该将它声明为一个数组

char welcomemsg[100]; // for example

在这种情况下,这&将变得不必要

send(*csock, welcomemsg, sizeof welcomemsg, 0);

但是,在这种情况下(如果您要发送一个字符串),您必须确定您要发送的确切内容。您可以发送整个数组对象,即sizeof welcomemsg如上例中的字节。或者您可以只发送字符串的重要字符,即strlen(welcomemsg)字节(或strlen(welcomemsg) + 1字节),如

send(*csock, welcomemsg, strlen(welcomemsg), 0);

如果消息表示为

const char *welcomemsg = "some message";

您将不得不使用后一种变体。

但是当你发送这样的字符串时,具有运行时长度,接收该字符串的问题变得更加复杂。接收代码如何知道要接收多少字节?通常,人们会先发送长度,然后再发送实际的字符串数据。

于 2012-11-28T17:57:49.830 回答
0

让我解决我看到的一些错误。

char *welcomemsg = "hello";
send(*csock, welcomemsg, sizeof(welcomemsg), 0);

sizeof(welcomemsg)将返回指针的大小。我相信您实际上想要发送字符串,而不是指向它的指针(这在接收方没有意义)。您可能希望将其设置为strlen(welcomemsg)+1. 请注意,发送字符串结尾字符需要 +1!

send(*csock, "Hello_Word", 10, 0); //was a working code

如果它奏效了,你很幸运。您要发送{'H','e','l','l','o','_','W','o','r','d','\0'}的内容由 11 个字节组成,而不是 10 个字节。如果接收器后面已经有 0,它可以正常工作,但其他任何事情很可能会导致接收器端崩溃。

为了减轻计算不同字符串(文字或非文字)的痛苦,您可以实现一个简单的包装函数:

void sendString(int socket_descriptor, const char* str) {
    send(socket_descriptor, str, strlen(str)+1, 0);
}

只要str是正确的以空字符结尾的 C 字符串,这应该可以工作。


我强烈建议您在尝试通过网络发送它们之前,稍微玩一下 C 字符串,了解它们的功能,如何在函数之间传递它们等。

于 2012-11-28T19:08:28.903 回答
0

send期望一个 void 指针作为它的第二个参数:send(int, const void*, size_t, int)

将您的代码更改为:

send(*csock, (void *)&welcomemsg, sizeof(welcomemsg), 0);

表示法&获得 的地址welcomemsg。该(void *)部分不是必需的,但它将地址从指向 char 的指针转换为 void 指针。


更新的问题:如果你想使用:

char welcomemsg = "hello";

//send initial welcome data || msg & src
send(*csock, (void *)&welcomemsg, sizeof(char) * 6, 0);

然后您需要将其更改为:

char *welcomemsg = "hello";

//send initial welcome data || msg & src
send(*csock, welcomemsg, strlen(welcomemsg), 0);

由于welcomemsg现在是指向字符数组“hello”开头的指针,因此已经有一个地址。

于 2012-11-28T17:52:23.560 回答
0

那应该是send(*csock, (void *)&welcomemsg, sizeof(welcomemsg), 0);

于 2012-11-28T17:52:32.880 回答