• ベストアンサー

perlのAF_INET、PF_INETとは

danyの回答

  • ベストアンサー
  • dany
  • ベストアンサー率35% (27/77)
回答No.1

PFは「ProtocolFamily」の略で、socket関数へ送るもの。 AFは「AddressFamily」の略で、connectで使うアドレス指定です。 Internetではアドレス指定がひとつしかない、つまり同値なので とりあえずはどちらでも問題なく使えます。 うろ覚えですが参考程度に。(^^; 詳しい方いましたら補足お願いします。

関連するQ&A

  • IO::Socket::INET で tcp が Bad protocol

    Perl 5.6.1 on Debian linux です。 LDAP+Sambaでsmbldap-toolsを使おうとしています。 が、その中のPerlスクリプトで IO::Socket::INET: Bad protocol 'tcp' というエラーが発生しています。tcp が Bad protocol な ことなんてあるんでしょうか?あるいは別に必要な モジュールあるいはパッケージがあるんでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • ソケットでのデータ送受信について教えてください

    はじめまして。 Perlでのソケット通信プログラムで質問があります。 現在ソケットで通信を行うテストプログラムを作っているのですが、 クライアントからサーバへの片方向送信は出来るのですが、 クライアントからデータ受信後、サーバからクライアントへ応答を 返す処理が上手くいきません。 私としては、クライアントとサーバの処理を逆にすればよいだけかな と思っているのですが認識違いでしょうか? 宜しくお願いします。 環境 OS:Linux 言語:Perl5.8 ■上手くいく場合(かなり省略します。ポイントだけ) サーバ側 $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){ printf("%s",$_); #受信データ } クライアント側 socket (SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin)); print SOCKET "Test Data!!\n"; →サーバ側端末にTest Data!!と表示 ■送受信しようとしてダメなもの サーバ側 $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){ printf("%s",$_); #受信データ } print C_SOCKET "Return Data!!\n"; クライアント側 socket (SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin)); print SOCKET "Test Data!!\n"; while(<SOCKET>){ printf("%s",$_); #応答データ } →サーバ側にはTest Data!!すら表示されない。  もちろんクライアント側にも。

    • ベストアンサー
    • Perl
  • perl Socketで文字化け

    お世話になります。 早速ですが、以下のスクリプトをWinXPHomeSP2+ActivePerl5.6.1の環境で実行しました。訳あって標準モジュールのみ使用しております。 #!/usr/local/bin/perl use Socket; use FileHandle; # デフォルトホストの設定 $host = 'jws.jalan.net'; $port = getservbyname('http', 'tcp'); $path = '/APICommon/OnsenSearch/V1/?key=and10fed2591c0&l_area=430400&xml_ptn=1'; #$path = 'APICommon/OnsenSearch/V1/?key=and10fed2591c0&l_area=430400&onsen_q=4&xml_ptn=1'; $ip = inet_aton($host) || die "host($host) not found.\n"; $sockaddr = pack_sockaddr_in($port, $ip); socket(SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, $sockaddr); autoflush SOCKET (1); print SOCKET "GET $path HTTP/1.1\nHost: $host\nConnection: close\n\n"; # HTTP応答を受信 while (<SOCKET>) { print "$_"; } # 終了処理 close(SOCKET); exit; 長くて恐縮です m(__)m このスクリプトを実行するとUTF8形式のXMLが出力されますが、なぜかその中の”弱アルカリ性低張性泉”という文字だけが文字化けしてしまいます。 ところがIE6やFireFox2などのブラウザで http://jws.jalan.net/APICommon/OnsenSearch/V1/?key=and10fed2591c0&l_area=430400&xml_ptn=1 に直接アクセスすると、文字化けせずに表示されます。 従ってPerlの実装が悪いのかと思ったのですが、上記スクリプト8行目付近の#$pathのコメントをはずして実行すると(クエリストリングにonsen_q=4が追加され、出力内容が絞り込まれます)、文字化けが発生するレコードが出力されるにも関わらず文字化けしません。 というわけで、問題箇所が切り分けられず、途方にくれております。対処方法などご教授いただければ幸いです。

    • ベストアンサー
    • Perl
  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • PerlでIO::Socket::INET: connect: Unknown errorについて プロキシ設定?

    PerlでIO::Socket::INET: connect: Unknown errorが発生します。IEを使う時でもインターネットに接続する場合、プロパティで192.168.1.1を設定しておりますが、 プロシキ接続できる、設定方法はあるのでしょうか?

    • ベストアンサー
    • Perl
  • 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);

  • C言語開発環境について

    このプログラムを実行出来るコンパイラ?あるいは開発環境を紹介して頂けませんか?出来れば無償版がいいです。よろしくお願い致します。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • クライアント側のIPアドレスを取得したいのですが...

    最近Perlを始めました。 ご指導よろしくお願いいたします。 クライアント側からtelnetにてサーバー側(linux)へ接続し、 perl ファイル名.pl にて実行します。 そのとき、クライアント側のIPアドレスを表示させたいのですがどのように記述したらよいでしょうか? インターネットで検索してみましたが私にはよく分かりません。どうぞよろしくお願いいたします。 #!/usr/bin/perl use Socket; $hersockaddr = getpeername(SOCK); ($port, $iaddr) = sockaddr_in($hersockaddr); $herhostname = gethostbyaddr($iaddr, AF_INET); $herstraddr = inet_ntoa($iaddr);

    • ベストアンサー
    • Perl
  • C言語エラーの解決法教えてください。

    以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか? 1 IntelliSense: 識別子 "WSAData" が定義されていません 2 IntelliSense: 識別子 "wsaData" が定義されていません #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData; wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(9750); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } 教えてください。宜しくお願いします。

  • 実行ファイルのweb掲載可否

    以下のプログラムの実行ファイルをweb上に載せることはできるのでしょうか? #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }