• 締切済み

socketについて

こんにちわ ソケットプログラムで質問なのですが ソケット作成(listen状態)後selectで通信を待っています。 その後selectを抜けて(通信がきたはず?)その直後にあるacceptでプログラムがとまってしまいます。 selectでは上記で作成したソケットしか感知しないようになっています。 これはselectを抜けてacceptにいくまでに通信が切れてしまったのでしょうか? socket~bind~listen~select~accept               ↑このタイミングで通信が切れたのでしょうか?

  • sccbe
  • お礼率32% (9/28)

みんなの回答

  • jintoku
  • ベストアンサー率30% (4/13)
回答No.3

listen()の後にaccept()です。 accept()にてクライアントの接続をサーバーは待ちます。 その後、select()を使用し、データの受信や送信の監視に入ります。 参考URLはなかなかいいですよ。

参考URL:
http://cai.int-univ.com/sugsi/Lecture/NetProg/index.html
  • moritan2
  • ベストアンサー率25% (168/670)
回答No.2

selectの返り値でエラーが発生していないかチェックしていますか? また、新しい接続かの確認はしていますか? すでに接続が完了しているところから、何かパケットがきてもselectは終了しますけど、そのときは新しい接続がきているわけではないので、acceptは待ちに入りますよ。

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

「これはselectを抜けてacceptにいくまでに通信が切れてしまったのでしょうか?」だとしたら accept が失敗すると思います(すぐに切れないかもしれませんが)。 可能性が高いのはプログラミングのミスです。例えば、select を外して、listen してすぐに accept で待ってみるとどうなりますか?もしこれで OK なら select の間違いで、例えば、maxfd の値を +1 していないとか、がありそうな間違いです。

関連するQ&A

  • fsockopenでsocket_bindって出来ますか?

    fsockopenでsocket_bindって出来ますか? http://questionbox.jp.msn.com/qa4280167.html で以前あがっていた内容を見て、fsockopenでsocket_bindをしたいと思うのですが うまくいきません。 ソケット関数(socket_connect)を使おうかと思ったのですが、それだとセッション中のタイムアウトは設定できても 接続のタイムアウトが設定出来ないため実用的でないと考えました。 やろうと思っている事は上記のURLの方と同様に複数IPアドレス環境下でのHTTPクライアントの 作成です。 fsockopenでのIPアドレスのバインド、もしくはsocket_createでの接続タイムアウトの方法を ご存知の方いらっしゃいましたらアドバイスをよろしくお願いします。

    • 締切済み
    • PHP
  • javaのsocketインスタンスについて

    javaでソケット接続するプログラムを作成しています。 socketを.closeした場合、このsocketインスタンスのシステムリソースは開放されるのでしょうか? お詳しい方おられましたらよろしくお願いします。

  • Android Socket.connectエラー

    Androidでソケット通信するプログラムを作っています。 PC側がソケットサーバーをたてて(accept)、 Android側でクライアントとして接続(connect)するようにしています。 connectを実行している部分のソースは以下のようにしています。 ----------------- String ip = "192.168.XX.XX"; <-PCのIPアドレス int port = 9999; socket = new Socket(); InetSocketAddress addr = new InetSocketAddress(ip, port); try{ socket.connect(addr); return true; }catch(IOException e){ e.printStackTrace(); return false; } ------------------ 上記やり方でまずはエミュレータで試したところうまく行きました、その後 実機に入れて同じように実行したところconnectのところで例外が飛んできます。 メッセージは"no route to host"でした。 実は全く同じソースで以前は実機でもできていたはずなんですが、 最近試したところできなくなっているようでした。 Android端末はXperia Arcですが、OSを2.3.4にバージョンアップしたことくらいで 以前と特に変わったところはないと思うのですが 原因として何が考えられるでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • ソケットプログラミングについて_WinSock2

    コネクションの確立はlisten関数、accept関数、connect関数を用いて行い、パケット送信の場合は、UDPで送信するというプログラムを作成したいと思っています。 この場合、listen関数、accept関数、connect関数を使用する際は、TCPソケットをオープンするという形になるのでしょうか? それとも、listen,accept,connect関数は、UDPソケットオープンでよいのでしょうか? よろしくお願いします。

  • Linuxのsocket接続でacceptできない

    Ubuntu 10.10 + gcc4.4 + eclipse で C言語プログラミングをしています。 ソケットを使用したプログラムを試していたのですが、思うように動作しません。 作成したプログラムは以下のようなものです。 ・ローカルマシン上で、サーバプログラム、クライアントプログラムを用意する ・サーバ側はソケット作成後、クライアントが接続するまで listen する ・クライアントはサーバに接続したら、接続した旨を表示する という初歩的なものです。 問題は、サーバ側が accept したときに戻り値 -1 を返却して終了してしまうことです。 以下が作成したソースです。 ■■■▼ サーバ側ここから ▼■■■ #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_un srv; socklen_t socklen; /* ソケット名をコマンド入力で受け取る */ if(argc != 2) { puts("USAGE: mksock <filename>"); exit(EXIT_FAILURE); } /* ソケット作成 */ if((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){ exit(EXIT_FAILURE); } /* srv 初期化 */ memset(&srv, 0, sizeof(srv)); srv.sun_family = AF_UNIX; strncpy(srv.sun_path, argv[1], sizeof(srv.sun_path)); /* バインド */ if((bind(sockfd, (struct sockaddr *)&srv, SUN_LEN(&srv))) < 0){ exit(EXIT_FAILURE); } /* クライアントからの接続待ち */ if((listen(sockfd, 5)) < 0) { exit(EXIT_FAILURE); } printf("socket available: %s, sockfd=%d\n", srv.sun_path, sockfd); /* 接続がある限りくりかえす */ int sockResult; while(1) { sockResult = accept(sockfd, (struct sockaddr *)&srv, &socklen); printf("sockResult = %d, sun_path=%s\n", sockResult, srv.sun_path); if (sockResult < 0) break; puts("new connection granted"); } puts("mksock end"); exit(EXIT_SUCCESS); } ■■■▲ サーバ側ここまで ▲■■■ ●●●▼ クライアント側ここから ▼●●● #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_un cli; socklen_t socklen; /* ソケット名をコマンド入力で受け取る */ if(argc != 2) { puts("USAGE: sockconn <filename>"); exit(EXIT_FAILURE); } /* ソケット作成 */ if((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){ exit(EXIT_FAILURE); } /* クライアント設定 */ memset(&cli, 0, sizeof(cli)); cli.sun_family = AF_UNIX; strncpy(cli.sun_path, argv[1], sizeof(cli.sun_path)); /* サーバへ接続 */ socklen = SUN_LEN(&cli); if(connect(sockfd, (struct sockaddr *)&cli, socklen)) { exit(EXIT_FAILURE); } printf("connected to socket %s\n", cli.sun_path); exit(EXIT_SUCCESS); } ●●●▲ クライアント側ここまで ▲●●● これから作成されたバイナリを同一フォルダに置いて、作成ユーザで、カレントディレクトリで実行しました。 以下が実行時の入出力です(カッコ内は実行順序)。 ■▼ サーバ側ここから ▼■ $ ./mksock jjj1…(1) $ socket available: jjj1, sockfd=3 $ sockResult = -1, sun_path=jjj1 $ mksock end ■▲ サーバ側ここから ▲■ ●▼ クライアント側ここから ▼● $ ./sockconn jjj1…(2) $ connected to socket jjj1 ●▲ クライアント側ここから ▲● 上記のように、サーバ側が accept 時に -1 を返却しています。 パーミッションについては以下になっています。 srwxr-xr-x 1 hoge hoge 0 2011-09-04 21:36 jjj1 -rwxr--r-- 1 hoge hoge 86870 2011-09-04 21:36 mksock -rwxr--r-- 1 hoge hoge 86775 2011-09-04 21:36 sockconn パーミッションを見る限り、ソケットファイルにはアクセスできているかと。 おそらく環境周りではないかと思いますが、考えつきません。 linux プログラミングに詳しいかた、よろしくお願いいたします。

  • ソケット通信でチャットプログラム(unix c言語)

    c言語のソケット通信でチャットプログラムを作り中です 仕様:あるクライアントからメッセージがサーバに送信された時点でサーバは接続されたいる全てのクライアントにメッセージを送信する。 以下のようにクライアントからの接続(accept)がある度に、その返り値であるファイルディスクリプタにに対するreadと全クライアントに対するwriteの処理を行うchild関数をforkで起動します。これだとforkが起動した時点での全てのファイルディスクリプタ(接続されている全クライアント)の情報をchild関数に渡せますが、それ以降増え続けていくファイルディスクリプタの情報をchild関数に渡せないので、最初の方に接続したクライアントからのメッセージをそれ以降接続した他のクライアントに送信できないという状態です。 main() {   socket()   bind()   listen()     while(1){       accept()       if(fork()==0) {        child()       }     } } child() {   select()   if(FD_ISSET()) {     read()     write()   } } ※forkやソケット通信に関してかなり初心者なので、ソースや説明分が意味不明かもしれませんがよろしくお願いします。

  • 前回はごめんなさい。pythonでcgiとソケット

    どうもこんにちは。 この前の質問は補足しようと思いサブアカウントを作成したら 利用規約に引っかかったみたいで削除されてしまいました。 自分が何も知らないばかりに回答者の方々には不快な思いをさせてしまったことをお詫びします。 本題ですが、 pythonのプログラムをサーバーで動かそうと思って、 .cgiのファイルを作成しました。 そして、httpの形にして文字を表示することは出来たのですが、 本当にしたいのはソケット通信なんです。 自分のPCでのソケット通信(サーバー&クライアント)はできますし、 cgiも簡単なものなら動くようになりました。 が、cgiでソケット通信ができません。 httpのリクエストでgetしろよ。と思うかもしれませんが、 ソケット通信じゃないとダメなんです。 無理なら諦めますが、出来るならやり方を教えて下さい。 自分のPCでのソケット通信のプログラムは以下のものとなります。 #!/usr/local/bin/python #coding: utf-8 import socket import time host = "localhost" port = 50000 data = "HOST:"+host+"\nPort:"+str(port) port = int(port) print ("python socket server") print (data) while(True): print ("wait...\n") sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock_server.bind((host, port)) sock_server.listen(1) connect, addr = sock_server.accept() print ("Connect...\naddress:", addr) while(True): mes = connect.recv(1024) if not mes : break print ("Getmessage:", mes) connect.send("server message") print ("send message:server message") sock_server.close() これをサーバーに移そうと思うとこのままですとlocalhostでエラーが出ます。 なのでこれをgethostnameやgethostbynameにしようとすると、 こりゃまたエラーが出てしまいます。 どうしたら出来るのでしょうか?? サーバーは@pagesを今は使っていますが、 将来的には個人のサーバー(独自ドメインの)で動かすことになると思います。

    • ベストアンサー
    • CGI
  • Socketの使用方法について

    Socketの使用方法について サーバ側クラスA クライアント側クラスB とあり、Aは常駐しておりBから接続が合った場合に処理を行い、 処理後には待機状態に再び戻ります。 上記の場合に Aのクラスは以下のように作成しましたが、★の部分でCloseではなく、このままこのソケットを使用して待機したいです。 (ほぼ同時刻に複数のアクセスがあるため、資源の事を考えて使いまわしたいです。) どのような手段があるのかご指導お願い致します。 又、そもそもソケットに関しての理解が足りないとも思いますので、参考サイトを教えていただけると幸いです。 クラスA ServerSocket svsock = new ServerSocket(port); while (true) { Socket socket = svsock.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter(new PrintWriter(socket.getOutputStream(), true)); // 処理結果を受信 String line; if ((line = in.readLine()) != null) { System.out.println("受け取ったメッセージ : " + line); out.write("サーバで表示。"); out.newLine(); out.flush(); } socket.close(); // ★ }

    • ベストアンサー
    • Java
  • closeされたsocketへの動作について

    現在、javaを使用してプログラムを作成しているのですが、closeされたsocketに対しての動作について質問があります。 クライアント側のプログラムに ObjectOutputStream.writeObject(send); ObjectOutputStream.flush(); ObjectInputStream.readObject(); というものがあったとします。 サーバ側でsocketをcloseし、上記のプログラムを走らせた場合writeObjectにてsocketExceptionを検出する場合とreadObjectでEOFExceptionを検出する場合の2パターンが起こりうるのですが、これはなぜでしょうか? なお、上記のwriteObjectの引数のsendはSerializeを継承して作成した自作クラスのオブジェクトです。

  • androidのSocketでの正常なリソース解放

    お世話になります、androidでsocket通信を行なうプログラム(Wifi経由)を作成しておりますが、周期的に何度も接続、通信、切断をくりかえしておりますと、ソケットの.connectをするところで以下のエラーが出ます。 java.net.ConnectException: failed to connect to /192.168.10.12 (port 50000): connect failed: ENOBUFS (No buffer space available) 周期動作としては、 ソケットの接続後、受信待ち状態はスレッド内でソケットのInputStreamの.read()で行い(読み取ることができるまでブロックされるメソッド)、送信は、別のスレッドを起こしてソケットのOutputStreamでのflush()で送信しています。ある周期的タイミングで切断の手順を踏みます。 エラーの内容からして、切断するメソッド発行時にちゃんとリソースが解放されていない?のではないかと考えます。今、私がソケットを閉じよとする際に発行しているメソッドは以下になります(順同) (1)ソケットのOutputStream.close (2)ソケットのInputStream.close (3)ソケット.close 正常にソケット回りのリソースを解放する手順としてソケットの閉じる方法は間違っていますでしょうか? ちなみに、このエラーが出た後はインターネットへの接続も不可状態になり、端末を再起動しないと復帰しません。 大変困っております、お詳しい方おられましたら、よろしくお願いします。