1

以下にいくつかのCコードがあります:

char update[MAX_UPDATE_LEN];
int remoteLen;

char pholder;
pholder = recv(update,connectDescriptor,MAX_UPDATE_LEN,MSG_DONTWAIT); //error
remoteLen = atoi("pholder");

次のエラーが発生し続けます。

client.cpp:849: error: invalid conversion from `char*' to `int'

client.cpp:849: error: initializing argument 1 of `ssize_t recv(int, void*, 
size_t, int)'

client.cpp:849: error: invalid conversion from `int' to `void*'

client.cpp:849: error: initializing argument 2 of `ssize_t recv(int, void*, 
size_t, int)'

これらのエラーの原因は何ですか?

4

1 に答える 1

2

このコードにはいくつかの問題があります。

char update[MAX_UPDATE_LEN];
int remoteLen;

char pholder;
pholder = recv(update,connectDescriptor,MAX_UPDATE_LEN,MSG_DONTWAIT); <-- error here
remoteLen = atoi("pholder");
  1. recvssize_tは、通常は よりもはるかに大きい を返しますchar。そのため、リターン コードを安全に格納することはできませんpholder
  2. への引数recv()の順序が間違っています。宣言は次のとおりです。ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  3. atoi数値ではない文字列が渡されています"pholder"。のような文字列が必要"12345"です。ASCII でエンコードされた数字が期待どおりである場合は、 に渡すことができupdateますatoi

おまけ: forsizeof(update)の代わりに使用-- 型宣言またはサイズが変更された場合でも、期待される値を取得する必要があります。MAX_UPDATE_LENlenupdate

これを修正する方法は次のとおりです。

char update[MAX_UPDATE_LEN];

const int flags = MSG_DONTWAIT;
const ssize_t ret = recv(connectDescriptor, update , sizeof(update), flags);
if (-1 == ret)
{
    perror("recv");
    exit(1);
}
const int remoteLen = strtol(update, update + sizeof(update), 0);
于 2013-06-13T01:32:16.927 に答える