-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);

上記はコンパイラエラーを修正します。

ただし、実際には問題の性質は異なると思います。「ようこそメッセージ」は 1 文字だけで構成するつもりでしたか? 変数welcomemsgは単一の文字として宣言されています。1文字より長くするつもりなら、それを配列として宣言する必要がありました

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

send2番目の引数として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 に答える