• 締切済み

ActivePerlでDHCPクライアントのプログラムを作ろうと思って

ActivePerlでDHCPクライアントのプログラムを作ろうと思っています。 そこで、NICにIPアドレス未割り当ての状態でsocketを生成する方法ってあるのでしょうか。 $sock=IO::Socket::INET->new(LocalAddr=>"0.0.0.0", LocalPort=>68, PeerAddr=>"255.255.255.255", PeerPort=>67, Proto=>"udp", Broadcast=>1) or die $!; これでsocket生成を試みたのですがUnknown error~と出てしまいます。 IPアドレス未割り当ての状態では不可能なのでしょうか? 解決策がありましたらご教授お願いします。

  • Perl
  • 回答数1
  • ありがとう数2

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

CPAN は見られましたか。 Net::DHCPClient というご希望のことを行うモジュールが 登録されています。

参考URL:
http://search.cpan.org/~jwalgenb/Net-DHCPClient-1.0/DHCPClient.pm

関連するQ&A

  • UDPのソケットプログラミング

    ソケットプログラミングでの質問です. 初心者です. UDPクライアントで sock = socket(PF_INET,SOCK_DGRAM,0) でUDPソケットを生成した後に bind()なしで,UDPサーバ宛にsendto() を行った場合, サーバのrecvfrom()でクライアントの IPアドレスとポート番号が受け取ることができると思いますが ここでのIPアドレスはクライアントのアドレスで, ポート番号は他のクライアントの他ソケットが使用していないポート番号 が受け取ることができると考えてよろしいですか? クライアントのsendto()で自動的にポート番号が割り当てられるが, クライアントが,どのポートから送信したのかを知る方法はないですか?

  • httpsクライアントについて

    以下のようなプログラムでhttpsクライアントを作ろうと思ったのですが 何も表示されません。どのようにしたらよいかアドバイスをいただけない でしょうか? #!/usr/bin/perl $url='https://www3.idpass-net.sia.go.jp/neko/action/z0401'; &process; print "Content-type: text/html\n"; print "\n"; print $lines; exit(0); sub process { undef $lines; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; ($host,$path) = $url =~m!^https://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'https(443)'); print $socket 'GET ', $path, ' HTTP/1.1', CRLF, 'Host: ', $host, CRLF, CRLF; my $headerN = <$socket>; $lines .= $data while read($socket,$data,1024) > 0; }

  • UDPでのブロードキャスト送信

    Linuxで下記UDPブロードキャスト送信プログラムを作ったのですが、sendto()関数の戻り値が-1となり エラーとなってしまうので送信できません。 何が悪いのでしょうか? ちなみにIPアドレスは192.168.0.1 サブネットマスクは255.255.0..0でやっています。 又、サブネットマスクを0.0.0.0で試してもみましたがダメでした。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> int main() { int sock; struct sockaddr_in addr; int yes = 1; sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = inet_addr("255.255.255.255"); setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof(yes)); if(sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr))!=5) printf("send error!!\n"); close(sock); return 0; }

  • socket使用時の環境変数(REMOTE_ADDR)について

    色々調べても結局わかりませんでしたので もしお分かりになる方がいらっしゃれば 教えて頂ければ幸いです。 socketを使用するAというプログラムを作ったのですが、 そのプログラムからBというプログラムを呼び出した時、 Aに取得されるREMOTE_ADDRは、私のREMOTE_ADDRになるのですが、 Bに取得されるREMOTE_ADDRは、サーバのREMOTE_ADDRになってしまいます。 Bに対しても私のREMOTE_ADDRを取得させたいのですが、 方法はありますでしょうか? 具体的なSOCKET使用機構は以下のようになっております。 use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)', Proto => 'tcp'); select($socket); $|= 1; select (STDOUT); print $socket "POST $path HTTP/1.0",CRLF,CRLF; close($socket); どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Winsockプログラムの初歩的質問(connect()がうまくいかない)

    ソケットの練習をしています。とりあえずconnect()で通信経路を確立するところまでを書いたつもりですが、以下プログラムを実行すると「サーバーソケットに接続失敗」となります。 とりあえずprintf()でチェックしたところsocket()まではうまくいっているようです。 環境:Win2000 , VC++6.0 , LAN接続でDHCP→学内サーバー です。 よろしくお願いします。 #include<winsock2.h> #include<stdio.h> int main() { WSADATA wsaData; struct hostent *host; SOCKET sock1; SOCKADDR_IN name; WSAStartup(2 , &wsaData); host=gethostbyname("www.goo.ne.jp"); //gooのIPアドレスを取得 sock1 = socket(AF_INET,SOCK_STREAM,0); //ソケット生成 /**ここからがあやしい**/ name.sin_port=htons(80); name.sin_addr=*((in_addr *)*host->h_addr_list); if(connect(sock1,(PSOCKADDR)&name,sizeof(name))){ printf("サーバーソケットに接続失敗\n"); return 0; } 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
  • 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);

  • socketでの複数NICの扱い

    socketを使ってUDPのプログラムの勉強をしているのですが、マシンに複数のネットワークカードが搭載されていて複数のIPアドレスを持っている場合、sendto()でどのNICから送信するかを指定できないものなんでしょうか よろしくお願いいたします。

  • 圧縮クライアントのプログラム

    java eclipeを使って通信のプログラムを勉強しています。 参考にしている本は、TCP/IPソケットプログラミングjava編です。 本に書かれてるソースコードのとおりに入力したら、 Exception in thread "main" java.io.FileNotFoundException: test.txt (No such file or directory) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at socket_127.CompressClient.main(CompressClient.java:20) というエラーが出ました。 このエラーを調べると、 「指定されたパス名で示されるファイルが開けなかったことを通知します。」とかかれていました。このプログラムが入っているフォルダの中にtest.txtというテキストファイルを作成して同じフォルダに入れてあります。 このプログラムの引数は、 <Server> IPアドレス <Port>  110 <File> test.txt としました。 このエラーをとる方法を教えていただけないでしょうか? 下にソースコードを載せますので、解決方法をお願いします。 package socket_127; import java.net.*; // for Socket import java.io.*; // for IOException and [File]Input/OutputStream public class CompressClient { public static final int BUFSIZE = 256; // Size of read buffer public static void main(String[] args) throws IOException { if (args.length != 3) throw new IllegalArgumentException("Parameter(s): <Server> <Port> <File>"); String server = args[0]; int port = Integer.parseInt(args[1]); String filename = args[2]; FileInputStream fileIn = new FileInputStream(filename); FileOutputStream fileOut = new FileOutputStream(filename + ".gz"); Socket sock = new Socket(server, port); sendBytes(sock, fileIn); InputStream sockIn = sock.getInputStream(); int bytesRead; byte[] buffer = new byte[BUFSIZE]; while ((bytesRead = sockIn.read(buffer)) != -1) { fileOut.write(buffer, 0, bytesRead); System.out.print("R"); } System.out.println(); sock.close(); fileIn.close(); fileOut.close(); } private static void sendBytes(Socket sock, InputStream fileIn) throws IOException { OutputStream sockOut = sock.getOutputStream(); int bytesRead; byte[] buffer = new byte[BUFSIZE]; while ((bytesRead = fileIn.read(buffer)) != -1) { sockOut.write(buffer, 0, bytesRead); System.out.print("W"); } sock.shutdownOutput(); } }

  • perlのソケットがうまく作動しません。

    sakuraインターネットサービスでドメインを取得して、通常はそこでサービスを使っているのですが、このページの情報を、自分の持っているもうひとつのホームページ(プロバイダによって与えられたもの)上でも、データを引っ張り出して同じ情報を使いたいと思っているのですがうまくいきません。 どのようにしたらうまくいくものでしょうか? ご教授、宜しくお願い致します。 #!/usr/local/bin/perl $host = "domain.com"; $file = ""; use IO::Socket; print "Content-type: text/html\n\n"; $file = "/"."$file"; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$host", PeerPort => "host(80)", ); unless ($remote){die "cannnot connect to help daemon on $host";} $remote->autoflush(1); print $remote "GET $file HTTP/1.0\n\n"; while(<$remote>){ print "$_"; }

    • ベストアンサー
    • Perl

専門家に質問してみよう