The BAQ/Memo/Linux C/TCPソケットがTIME_WAITでも使えるようにする

Japanese English
Nuclear Physics Data Acquisition Orchestra Gallery Memo Diary Link Home
Linux C Fortran Postscript Home

もどる

TCPソケット(サーバー側)をcloseすると、そのportはしばらくの間使用不可になります。netstatで見るとTME_WAITの状態です。
このTIME_WAITの状態ではデフォルトではソケットをbindできないのですが、bindする前にsetsockoptでSO_REUSEADDRオプションを設定すると使えるようになります。

int sock, sockopt = 1;
struct sockaddr_in saddr;

sock = socket(PF_INET, SOCK_STREAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));

memset((char *)&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(ポート番号);

bind(sock, (struct sockaddr *)&saddr, sizeof(saddr));

Last Update: 2005/4/6
Hidetada Baba
baba rarfaxp.riken.jp