こんにちは私は受け入れられたsockFDを入力として受け取り、プレゼンテーション形式のIPアドレスを文字列に出力する関数を作成しました。この関数は、ヌルポインタを返すinet_ntopからの呼び出しで文字列をパッキングしてエラーを表示するまで、正常に動作しているようです。エラーは、RAMとROMを十分に持っているため、私が理解していないデバイスにスペースが残っていないと表示されます。とにかく私が使用している機能は荒いです。inet_ntop:デバイスにスペースが残っていない
void getTheirIp(int s, char *ipstr){ // int s is the incoming socketFD, ipstr points the the calling
// functions pointer.
socklen_t len;
struct sockaddr_storage addr;
len = sizeof(addr); //I want to store my address in addr which is sockaddr_storage type
int stat;
stat = getpeername(s, (struct sockaddr*)&addr, &len); // This stores addrinfo in addr
printf("getTheirIP:the value of getpeername %d\n",stat);
// deal with both IPv4 and IPv6:
if ((stat=addr.ss_family) == AF_INET) { // I get the size of the sock first
printf("getTheirIP:the value of addr.ss_family is %d\n",stat);
ipstr = malloc(INET_ADDRSTRLEN); // I allocate memory to store the string
struct sockaddr_in *s = (struct sockaddr_in *)&addr; // I then create the struct sockaddr_in which
// is large enough to hold my address
if(NULL == inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr))){ // I then use inet_ntop to
printf("getTheirIP:the value of inet_ntop is null\n");// retrieve the ip address and store
perror("The problem was"); // at location ipstr
}
} else { // AF_INET6 this is the same as the above except it deals with IPv6 length
ipstr = malloc(INET6_ADDRSTRLEN);
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof(ipstr));
}
printf("%s",ipstr);
}
収まるには大きすぎると、私はこの部分の修正に集中したいので、私はプログラムの残りの部分を残しました。しかし、私はこの関数を呼び出すmain()の一部を紹介します。
newSock = accept(listenSock,(struct sockaddr *)&their_addr,&addr_size);
char *someString;
getTheirIp(newSock,someString);
助けがあれば助かります。ありがとう! ipstr
ポインタ(それは、ポインタのサイズが得られます、4
または8
のようなもの)であるため、sizeof
が間違っていること
私は、あなたが割り当てたメモリの量と、実際のアドレスのサイズではありません。それはあなたが意味することですか?私はsizeof()が割り当てられたメモリの量を得ていると思った。ありがとう!!! –
あなたはまったく支配してくれました。 –