[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12830] Re: Java ネットワ ークプログラミングの真髄 第 1 回議 事録



高橋(智)です。

"TAKAHASHI,Toru" wrote:
> p.29 3.3.3 バックログ
> 最大数はいくつか? OSの設定上の最大より大きな値を指定したらどうなる?
>     → 宿題

OSに依存すると思いますが、listen(JavaのAPIではない)のバックログサイズとして特別な値 SOMAXCONN
を指定することで、最大数を利用することができるようです。

Googleで検索しますと、
[Sun Java System Message Queue 3 2005Q1 リリースノート]
http://docs.sun.com/source/819-2033/index.html
[Winsock Programmer's FAQ: Winsock 上級者向けの議論]
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html
の後ろの段落あたりに、Windowsのバックログサイズや接続数に関する記述がありました。

試しに以下のサーバをWindows上で動作させてみました。
サーバの種類とバックログ最大数は以下のとおりでした。
Windows 2000 Professional 32bit (SP4) ... 200
Windows XP Professional 32bit (SP2)   ... 200
Windows XP Professional 64bit (SP2)   ... たくさん
Windows Server 2003 R2 32bit          ... たくさん

[サーバ]
-------------------------------------------------------------
import java.net.*;
import java.io.*;
public class TCPDummyServer {
  public static void main(String[] args) throws Exception {
    int port = 9999;
    int backlog = 100000;
    ServerSocket ss = new ServerSocket(port, backlog);
    while(true) {
      Socket cs = ss.accept();
      System.out.println("accept!!");
      Thread.sleep(100000000);
    }
  }
}
-------------------------------------------------------------
[クライアント]
-------------------------------------------------------------
import java.net.*;
import java.io.*;
public class TCPDummyClient extends Thread {
  public static String server = "";
  public static int port = 9999;
  public static int count = 0;
  public void run() {
    try {
      Socket socket = new Socket(server, port);
      System.out.println("Connected");
      Thread.sleep(1000000000);
    }
    catch(Exception ex) {
      ex.printStackTrace();
    }
  }
  public static void main(String[] args) throws Exception {
    server = args[0];
    while(true) {
      try {
        TCPDummyClient client = new TCPDummyClient();
        client.start();
        count++;
        System.out.println(count);
        Thread.sleep(500);
      }
      catch(Exception ex) {
        ex.printStackTrace();
      }
    }
  }
}
-------------------------------------------------------------


なお、Windows Server 2003 R2 に接続する際、何度か以下のようなエラーがクライアント側(Linux, CentOS4.6)で発生しました。理由は不明です。
-----------------------------------------------------------------
551
Connected
552
java.net.SocketException: Connection reset by peer
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:507)
        at java.net.Socket.connect(Socket.java:457)
        at java.net.Socket.<init>(Socket.java:365)
        at java.net.Socket.<init>(Socket.java:178)
        at TCPDummyClient.run(TCPDummyClient.java:11)
553
Connected
554
Connected
555
-----------------------------------------------------------------

-- 
高橋智宏