• ベストアンサー

IPアドレスを配列に代入する方法。

パケットモニタリング(tcpdumpみたいなもの)でIPアドレスを取得するプログラムがあるのですが、IPアドレスを配列に代入することが出来ません。 パケットモニタリングのソース void print_ip(struct ip *ip) { printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); /* ループ */ 実行画面 | Source IP Address: 12.34.56.78 | | Source IP Address: 34.56.78.09 | ・ ・ というふうにどんどん取得、表示していく このIPアドレス inet_ntoa(*(struct in_addr *) &(ip->ip_src))); を配列に代入していきたいのですが上手くいきません。一応自分でやってみたのですが、 void print_ip(struct ip *ip) { int *pa[2048]; static int i = 1; printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); i++; pa[i] = (int *)&(ip->ip_src); printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i])); if (i == 10) { for (i = 1; i < 10; i++) { printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i])); }} } という風にaddres[1]から順にどんどんIPアドレスを格納しようとしたんですがaddres[1]からaddres[10]まで表示するときに全部addres[10]に代入されているIPアドレスが表示されてしまいます。 おそらく配列にIPアドレスが上手く格納できてないんだと思うのですが。C言語初心者なので誰かご教授していただけないでしょうか? 宜しくお願いします。 OSはLinuxです。

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.5

がると申します。 んっと…ちょっと長くなりますのであらかじめお詫びを。 取り合えず上から順番に。 int *pa[2048]; 確保したいものが「struct in_addr *」であるからには(ip->ip_src の構造体の中身をチェック!!)、これは struct in_addr *pa[10]; としたほうがよいでしょう。かつ、今回の例ですと「関数を抜けた後もデータを保持したい」っぽいので、正確には static struct in_addr *pa[10]; と記述されるべきです。 static int i = 1; 直後にインクリメントが入るので、このままですと「配列の添え字が2からスタート」になってしまいます。 ここはやはり static int i = -1; としておくのがよろしいかと。 struct in_addr *inwk; 後ほど使いますのでここで宣言しておきます。 pa[i] = (int *)&(ip->ip_src); まず、キャストで「ポインタを無理やりintとして取得」するよりは、ストレートに「struct in_addr *」として保持したほうがよいです。 また、このままですと参照先が書き換わればデータも書き換わってしまうので(これが「全部addres[10]に代入されているIPアドレスが表示されてしま」う原因です)、ここは別途メモリを確保してデータを固定のものとして保持しておくべきでしょう。 したがって、このようなロジックに置換します(malloc後のfreeをしていないのでご注意を)。 // メモリ領域を新規に確保します inwk = (struct in_addr *)malloc(sizeof(struct in_addr)); // データをコピーします memcpy(inwk, &ip->ip_src, sizeof(struct in_addr)); // データを設定します pa[i] = (struct in_addr *)inwk; if (i == 10) { 添え字が10である場合、個数は11個になってしまいます。なので、10個で表示をしたいようであれば、ここは if (i == 9) { としておくとよいでしょう。 ほぼ同様の理由で for (i = 1; i < 10; i++) { も for (i = 0; i < 10; i++) { にします。 ーー これで概ね問題なく動くかと思います。 全体の関数を記述しておきます。 void print_ip(struct ip *ip) { static struct in_addr *pa[16]; static int i = -1; struct in_addr *inwk; printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); i++; inwk = (struct in_addr *)malloc(sizeof(struct in_addr)); memcpy(inwk, &ip->ip_src, sizeof(struct in_addr)); pa[i] = (struct in_addr *)inwk; printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i])); if (i == 9) { for (i = 0; i < 10; i++) { printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i])); } } } まだまだ問題点は山積みですが、取り合えず意図する程度の動きはするのではないかと思いますが、どうでしょうか?

zunzunzunzunzun
質問者

お礼

回答ありがとうございます。こちらの意図するようにプログラムが動いてくれました。貴重な時間、感謝いたします。ありがとうございました!

その他の回答 (5)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.6

paがstaticになってません。これじゃデーターをためられない。 #include <netinet/ip_icmp.h> #include <arpa/inet.h> #include <stdio.h> #include <errno.h> void print_ip(struct ip *ip) { static struct in_addr pa[11]; static int i = 0; i++; pa[i] = ip->ip_src; printf("送信先[%2d]%15s\n", i, inet_ntoa(pa[i])); if (i == 10) { printf("\n"); for (i = 1; i <= 10; i++) { printf("送信先[%2d]%15s\n", i, inet_ntoa(pa[i])); } } } int main(void) { int i; char buf[16]; struct ip ip; for (i = 0; i < 10; i++) { sprintf(buf, "192.168.0.%d", i + 1); inet_aton(buf, &ip.ip_src); print_ip(&ip); } return 0; }

zunzunzunzunzun
質問者

お礼

おっしゃられた通り、paがstaticになっていませんでした。ご指摘ありがとうございました。上記のプログラムを参考に勉強していこうと思います。ありがとうございました。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.4

よく見たら、struct in_addr型でpaは配列宣言しないと駄目でしょう。 inet_ntoaに渡すのは、struct in_addr構造体のip_srcメンバです。実体を入れるので、pa[*].ip_srcでアクセスするように修正すれば上手く行くのでは?

zunzunzunzunzun
質問者

お礼

貴重な時間をお使いいただいてありがとうございました。 やはりまだまだ勉強不足を痛感しました。プログラムも思うように動いてくれました。本当に何回も回答していただいてありがとうございました。

zunzunzunzunzun
質問者

補足

こちらの知識不足で申し訳ありません。 おっしゃられていることはこういった感じでよろしいでしょうか?? void print_ip(struct ip *ip) { struct in_addr pa[2048]; static int i = 0; printf("Protocol: IP\n"); printf("+-----+------+------------+-------------------------+\n"); printf("| IV:%1u| HL:%2u| T: %8s| Total Length: %10u|\n", ip->ip_v, ip->ip_hl, ip_ttoa(ip->ip_tos), ntohs(ip->ip_len)); printf("+-----+------+------------+-------+-----------------+\n"); printf("| Identifier: %5u| FF:%3s| FO: %5u|\n", ntohs(ip->ip_id), ip_ftoa(ntohs(ip->ip_off)), ntohs(ip->ip_off) &IP_OFFMASK); printf("+------------+------------+-------+-----------------+\n"); printf("| TTL: %3u| Pro: %3u| Header Checksum: %5u|\n", ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum)); printf("+------------+------------+-------------------------+\n"); printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); printf("+---------------------------------------------------+\n"); printf("| Destination IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_dst))); printf("+---------------------------------------------------+\n"); i++; pa[i] = ip->ip_src; printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i].ip_src)); }

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.3

代入式の方も変更が必要です。 >pa[i] = (int *)&(ip->ip_src); >&(ip->ip_src); では、アドレス入れてます。 pa[i] = ip->ip_src; では?

zunzunzunzunzun
質問者

補足

たびたび申し訳ありません。ご指摘の部分を変えたら代入 に互換性のない型とでてしまいました。

回答No.2

外の、変数iのループであるfor文か、while文がないように思いますが、 print_ip関数の全文を提示していただくわけには行かないですか?

zunzunzunzunzun
質問者

補足

print_ip関数はこれで全文なのですが… print_ip関数以外でループ処理をおこなってるみたいなんですが、全文だと800行ぐらいなんですが大丈夫でしょうか? void print_ip(struct ip *ip) { int *pa[2048]; static int i = 0; printf("Protocol: IP\n"); printf("+-----+------+------------+-------------------------+\n"); printf("| IV:%1u| HL:%2u| T: %8s| Total Length: %10u|\n", ip->ip_v, ip->ip_hl, ip_ttoa(ip->ip_tos), ntohs(ip->ip_len)); printf("+-----+------+------------+-------+-----------------+\n"); printf("| Identifier: %5u| FF:%3s| FO: %5u|\n", ntohs(ip->ip_id), ip_ftoa(ntohs(ip->ip_off)), ntohs(ip->ip_off) &IP_OFFMASK); printf("+------------+------------+-------+-----------------+\n"); printf("| TTL: %3u| Pro: %3u| Header Checksum: %5u|\n", ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum)); printf("+------------+------------+-------------------------+\n"); printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); printf("+---------------------------------------------------+\n"); printf("| Destination IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_dst))); printf("+---------------------------------------------------+\n"); i++; if (i == 10) { for (i = 1; i < 10; i++) { printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) &(pa[i]))); }} pa[i] = (int *) &(ip->ip_src); printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) &(pa[i]))); }

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

>int *pa[2048]; って宣言は、paのポインタを格納する配列を2048個作ってるのでは? 宣言を int pa[2048]; にしてみては如何でしょうか?

zunzunzunzunzun
質問者

補足

早速のアドバイスありがとうございます。 ご指摘の部分をint pa[2048]; に変えて見たところ、「代入により、キャストなしでポインタから整数を作りました」と警告が出てしまいました。 勉強不足で申し訳ありません。

関連するQ&A

  • アドレスの比較について

    こんにちは。質問させてもらいます。 pcap.hを使って、取得したパケットの送信元アドレスと送信先アドレスを比較させて、違うアドか同じアドかを判断したいと考えています。 しかし、送信元アドレスと送信先アドレスが明らかに違うのに、同一だと判断してしまいます。原因を教えてもらえないでしょうか。 ipアドレスを格納する構造体は struct ip { struct in_addr ip_src, ip_dst; }; としました。 ↓が試した方法です。 1.inet_ntoaの値をそのまま比較 if ( inet_ntoa(ip->ip_src) == inet_ntoa(ip->ip_dst) ) { printf("\nアドレスいっしょ\n"); //↓はアドレスが違っているかどうか確認 printf("src:%s\n",inet_ntoa(ip->ip_src)); printf("dst:%s\n",inet_ntoa(ip->ip_dst)); } else { printf("\nアドレス違う\n"); } 2.strcmpを使う if ( strcmp(inet_ntoa(ip->ip_src),inet_ntoa(ip->ip_dst)) == 0) { printf("\nアドレスいっしょ\n"); printf("src:%s\n",inet_ntoa(ip->ip_src)); printf("dst:%s\n",inet_ntoa(ip->ip_dst)); } else { printf("\nアドレス違う\n"); } どちらでやってもアドレスは同じと判断してしまいます。printfで確認するときっちり違うアドが表示されるのに・・何故? きちんとアドレスを比較してくれるようにif文の中身を変えたいです。 ご助力お願いできますか。

  • getaddrinf()で取得したIPアドレス表示

    お世話になります。 C言語でソケット通信の勉強中です。 CentOS6.4を使っています。 LIST1は、 IPアドレスではなくホスト名がコマンド引数で渡されたとき、 getaddrinfo()でIPアドレスを取得して、 sendto()でサーバにメッセージを送信するだけの、 クライアントのプログラムです。 このLIST1のudp通信自体は上手くいくのですが、 終わりの方で、 getaddrinfo()で取得したIPアドレスを inet_ntoa()を使って文字列表示しようとすると、 セグメンテーション違反です (コアダンプ)となってしまいます。 inet_ntoa()の引数が疑わしく、 いろいろ渡し方を変えたり、参照方法を変えたりしてみたのですが、、 なかなか解決しません。 ちゃんと、192.168.12.1とか表示するにはどうすれば良いでしょうか? ■LIST1 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> int main(int argc,char *argv[]){ int sock; struct addrinfo hints,*res; int n; int err; if(argc != 2){ fprintf(stderr,"Usage : %s dst \n",argv[0]); return 1; } /* IP アドレス表記+ホスト名両方に対応 */ memset(&hints,0,sizeof(hints)); hints.ai_family = AF_UNSPEC; /* IPV4 IPV6 両方に対応 */ hints.ai_socktype = SOCK_DGRAM; err = getaddrinfo(argv[1],"12345",&hints,&res); if(err != 0){ perror("getaddrinfo"); printf("getaddrinfo %s\n",strerror(errno)); printf("getaddrinfo : %s \n",gai_strerror(err)); return 1; } sock = socket(res->ai_family,res->ai_socktype,0); if(sock < 0){ perror("socket"); return 1; } { const char *ipverstr; switch (res->ai_family){ case AF_INET: ipverstr = "IPv4"; break; case AF_INET6: ipverstr = "IPv6"; break; default: ipverstr = "unknown"; break; } printf("ipverstr = %s\n ",ipverstr); } n = sendto(sock,"HELLO",5,0,res->ai_addr,res->ai_addrlen); //n = sendto(sock,"HELLO", 5, 0,(struct sockaddr *)addr, sizeof(addr)); if(n<1){ perror("sendto"); { } return 1; } printf("############ finish !! #######\n"); close(sock); freeaddrinfo(res); struct sockaddr_in *addr; addr = (struct sockaddr_in *)res->ai_addr; printf("inet_ntoa(in_addr)sin = %s\n",inet_ntoa((struct in_addr)addr->sin_addr)); return 0; }

  • セグメンテーション違反

    C言語でネットワークを流れるパケットの取得&解析を行っているのですが、実行時にセグメンテーション違反と出てしまい、困っています。デバッグオプションをつけてやってみたところ、プログラムが中断されたところは分かったのですが、どこが悪いのか分かりません。どなたかあやしいところがありましたらお教え下さい。 OSはLinuxでコンパイラはgccです。 void udp_scanport(struct ip *ip, struct udphdr *udp) { static struct in_addr *ipaddr[1024]; static int i = -1; static int udp_count[1024]; struct in_addr *inwk; static u_short udp_port[1024]; int u = 0; int k = 0; i++; inwk = (struct in_addr *)malloc(sizeof(struct in_addr)); memcpy(inwk, &ip->ip_src, sizeof(struct in_addr)); ipaddr[i] = (struct in_addr *)inwk; printf("送信元IPアドレス:%15s\n", inet_ntoa(*(struct in_addr *) ipaddr[i])); udp_port[i] = udp->uh_dport; /*デバッグしたら中断したところ*/ printf("UDP送信先ポート番号:%15u\n", ntohs(udp_port[i])); if (i == 100) free(inwk); }

  • IPアドレスを抽出して出力するプログラム

    下記のプログラムはIPアドレスを表示するプログラムです。for文を見てくれたら分かると思いますが、iが0~5まで繰り返し処理されるので、アドレスが5つ表示される結果になります。 このアドレスの先頭の数字(例えば「196.x.x.x」だと196)だけを見て先頭が196から始まるアドレスは表示して、先頭が196以外のアドレスは表示しないようにするにはどう書き加えればうまく実行できますか? OSはWinXPでコンパイラVC++です。 #include <stdio.h> #include <winsock2.h> #include <iphlpapi.h> int main() { DWORD i; PMIB_UDPTABLE pUdpTable; DWORD dwSize = 0; DWORD dwRetVal = 0; char *addr_ptr; if (GetUdpTable(NULL, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { pUdpTable = (MIB_UDPTABLE *) malloc (dwSize); } if ((dwRetVal = GetUdpTable(pUdpTable, &dwSize, 0)) == NO_ERROR) { if (pUdpTable->dwNumEntries > 0) { for (i=0; i<5; i++) { addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr; printf("Your Address: %s\n", inet_ntoa(*(struct in_addr *)addr_ptr)); } } } else { printf("GetUdpTable failed.\n"); LPVOID lpMsgBuf; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language (LPTSTR) &lpMsgBuf, 0, NULL )) { printf("\tError: %s", lpMsgBuf); } LocalFree( lpMsgBuf ); } return 0; }

  • for文が機能しません。どなたか原因を指摘して頂けますか。

    こんにちは。質問させて頂きます。 pcap.hで、「リスト構造に格納された送受ID・ポート」と、「キャプチャされたパケットの送受ID・ポート」を順に比較していって、同じであれば同一の通信フローとみなす、といったプログラムを作っています。 しかし、何故かfor文自体が機能せず、for文の中のprintf文が全く表示されないところをみると、for文をスルーしてしまっているようです。for文の中身の記述がおかしいのか、条件記述がおかしいのかのどちらかだとは思うのですが特定できません。 皆さんのお力をお貸し頂けないでしょうか。 以下がプログラムの一部です。 //ID・ポートを含んだリスト構造体作成 struct list { struct in_addr src, dst; u_short sport; u_short dport; struct list *next; }; //キャプチャされるパケットのID・ポート情報を記録する構造体 struct new_capture { struct in_addr new_src, new_dst; u_short new_sport; u_short new_dport; }; ループバック関数(){ //キャプチャされたパケット情報を構造体に写す struct new_capture nc; nc.new_dport = tcp->th_dport; nc.new_sport = tcp->th_sport; nc.new_src = ip->ip_src; nc.new_dst = ip->ip_dst; //リスト構造体の先頭と、ループさせるためのポインタを宣言 struct list flow_head; struct list *looplist; //問題のfor文 //looplistを利用して、キャプチャされたパケット情報と //リスト構造体に格納された情報とを比較する //同一ならばそれでbreak、全ての構造体と相違ならば //構造体の末端に新たに追加する for (looplist = &flow_head; looplist ; looplist = looplist->next) { if (inet_ntoa(looplist->src) == inet_ntoa(nc.new_src)) { if (inet_ntoa(looplist->dst) == inet_ntoa(nc.new_dst)) { if (looplist->sport == nc.new_sport) { if (looplist->dport == nc.new_dport) { printf ("送受アド、送受ポート同一"); break; } } } } else if (looplist->sport == nc.new_dport) { if (looplist->dport == nc.new_sport) { if (inet_ntoa(looplist->dst) == inet_ntoa(nc.new_src)) { if (inet_ntoa(looplist->src) == inet_ntoa(nc.new_dst)) { printf ("送受アド、送受ポート同一逆順"); break; } } } } else { printf ("同一ではない"); } } //通信フロー数を1増やし、リスト構造体にIDとポートを追加する if (looplist == NULL) { flow_counts++; printf ("通信フロー追加:%d\n", flow_counts); looplist = (struct list *) malloc (sizeof (struct list));   looplist->dport = nc.new_dport; looplist->sport = nc.new_sport; looplist->src = nc.new_src; looplist->dst = nc.new_dst; } free(looplist); return; } 上のlooplistにアドレスを代入しているはずなのに、ずぅ~っとNULLになっているらしく、for文が終わった後のif文が常に機能するようになってしまっています。 for文が機能しないのは何故なのか。 looplistがずっとNULLなのは何故なのか。 この二つが解決出来ればなんとか出来ると思うのですが力不足でそれに及びません。何か気が付かれた事等ありましたらご教授頂けないでしょうか。どうぞよろしくお願いします。

  • ポインタへの代入

    ポインタにアドレスを代入するには、0xは必要なのでしょうか? 手持ちの参考書には以下のようなプログラムがあります。 int *pa = 0; pa++; printf("pa...%p\n",pa); 最初の行は int *pa = 0x0; にすべきだと思うのですが。またprintfの,以降のpaになぜ&がいらないのでしょうか?

  • UDP通信について

    UDP通信で困っています。 TCP/IP通信はすぐにうまくいったのですが、 UDPの簡単なサンプルがちゃんと動きません。 間違いがあればご指摘ください。 よろしくお願いします。 (クライアント側ソース int sock; struct sockaddr_in din; memset(&din, 0, sizeof(din)); din.sin_port = htons(50050); din.sin_family = AF_INET; din.sin_addr.s_addr = inet_addr("サーバーIP"); sock = socket(AF_INET, SOCK_DGRAM, 0); int buf = 12345; sendto(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&din,sizeof(struct sockaddr_in)); (サーバー側ソース int sock; struct sockaddr_in sin; sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(50050); sin.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { return(1); } struct sockaddr_in fromaddr; socklen_t len = sizeof(struct sockaddr_in); int buf; recvfrom(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&fromaddr,&len); printf("recv:%d\n",buf);

  • アドレスをint変数に代入する方法

    printfで表示したアドレス値を、int変数に代入するのが目的です。 #include <iostream> using namespace std; main(){ char buf[20]; char *(*pp)[2]; char *p[2]; int i; pp = &p; printf("%lu\n", pp); // i = (int)(&pp); sprintf(buf, "%lu\n", pp);//// i = atoi(buf);//// printf("%lu\n", i); } とりあえずできていますが、 pp = &p;以降の処理で、bufを使ったり非推奨?のatoi()を使っています。 pp = &p;以降の処理でもっとよい方法はないでしょうか? また、このソースは不正なことをやっていないでしょうか? 必要な初期化をやってない、などということはありませんか?

  • UNIXでのTCP/IP

    クライアントとサーバの通信をするプログラムを作っているのですが gethostbyaddr()でホスト名を得てそれをprintf()からホスト名を表示させたいのです。 //サーバ側 #define MAXPENDING 5 void DieWithError(char *errorMessage); void HandleTCPClient(int clntSocket); char * ResolveAddr(unsigned long addr) { struct hostent *host; host = gethostbyaddr((char *)&addr, sizeof(addr),AF_INET); if (host == NULL) { fprintf(stderr, "gethostbyaddr() failed"); exit(1); } return host->h_name; } int main(int argc, char *argv[]) { int servSock; int clntSock; struct hostent *host; struct sockaddr_in echoServAddr; struct sockaddr_in echoClntAddr; unsigned short echoServPort; unsigned int clntLen; if(argc != 2) { fprintf(stderr, "Usage: %s <Server Port>\n", argv[0]); exit(1); } echoServPort = atoi(argv[1]); if((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0) DieWithError("socket() failed"); memset(&echoServAddr, 0, sizeof(echoServAddr)); echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); echoServAddr.sin_port = htons(echoServPort); if(bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr))<0) DieWithError("bind() failed"); if(listen(servSock, MAXPENDING)<0) DieWithError("listen() failed"); for (;;) { clntLen = sizeof(echoClntAddr); if((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr,&clntLen))<0) DieWithError("accept() failed"); ResolveAddr(echoClntAddr.sin_addr.s_addr); printf("Handling client %s\n", host->h_name); HandleTCPClient(clntSock); } } コンパイルするとクライアントからIPアドレスを渡した際にセグメンテーション違反になるのですがどこが間違っているのか分かりません。

  • アドレスをintに代入する方法

    適当なアドレスをprintfで表示し、その値をintに代入するのが目的です。 #include <iostream> using namespace std; main(){ char buf[20]; char **pp; char *p = "\0"; int i; pp = &p; printf("%lu\n", pp); sprintf(buf, "%lu\n", pp); i = atoi(buf); printf("%lu\n", i); } とりあえずできていますが、 pp = &p;以降の処理で、bufを使ったり非推奨?のatoi()を使っています。 pp = &p;以降の処理でもっとよい方法はないでしょうか?

専門家に質問してみよう