TCP의 TIME_WAIT상태 (SO_REUSEADDR)

http://wwwi.tistory.com/tag/winsock

TCP의 서버 프로그램을 종료한 바로뒤 다시 서버를 기동하면
bind에서 에러(Address aleady in use)로 끝날 때가 있다.

TCP의 서버 프로그램을 종료하고 다시 기동시켰는데 왜 bind가 되지 않을까?
라고 생각하며 시간이 지난후 다시 기동시키면 문제업이 bind가 된다.

이 문제는 TCP 자체 사양에 의하여 일어나는 문제이다.
구체적으로는 TCP의 TIME_WAIT상태가 bind를 fail시킨다.

서버는 TCP 세션을 받은 상태에서 close하면 TIME_WAIT상태가 된다.
이때 주의해야되는 것은 TCP 서버의 TIME_WAIT가 발생하는 경우와
발생하지 않는 경우가 있다는 것이다.

TCP서버 쪽에서 close를 먼저 실행하면 TIME_WAIT상태가 발생하지만
TCP클리아언트 쪽에서는 먼저 close를 실행해도 서버 쪽에
TIME_WAIT가 발생하지 않는다.
더 구체적으로 쓴다면 클라이언트가 먼저 FIN을 송신하면 TCP서버 쪽에는
TIME_WAIT상태에 빠지지않는다.

TIME_WAIT상태는 "netstat -na" 명령을 도스창에서 쳐보면 확인할 수 있다.
TCP세션이 확립된 경우 "netstat -na"를 쳐보면 ESTABLISHED라고 표시되어진다.
TCP세션이 종료된 후 "netstat -na" 명령을 쳐보면 TIME_WAIT생태를 볼수있다.

TIME_WAIT상태는 같은 포트를 다른 프로세스가 이용하는 것을 막기 위해
TCP 규격으로 규정되어져있다.
TIME_WAIT상태의 포트와 동일한 포트를 bind하려하면 bind는 실패한다.
단 끝나버린 프로세스가 쓰고 있는 포트 번호를 바로 쓸 수 없으면 곤란함으로
TIMW_WAIT상태로 남아있는 TCP세션이 있더라도 bind할 수 있는 방법이 있다.
그 방법이 SO_REUSEADDR을 유효하게 하는 것이다.

SO_REUSEADDR를 유효하게 하는 방법은 setsockopt함수를 이용하여
소켓에 옵션을 설정할 수 있다.


#include

#include


int main()

{

WSADATA wsaData;

SOCKET sockSvr;

SOCKET sockSS;

int nlen;

struct sockaddr_in addrSockSvr;

struct sockaddr_in addrSockclt;

BOOL bValid = 1;


// 윈속 초기화

WSAStartup(MAKEWORD(2, 0), &wsaData);


// 소켓 만들기

sockSvr = socket(AF_INET, SOCK_STREAM, 0);


// 소켓 설정

addrSockSvr.sin_family = AF_INET;

addrSockSvr.sin_port = htons(333);

addrSockSvr.sin_addr.S_un.S_addr = INADDR_ANY;


// 소켓 옵션 설정

setsockopt(sockSvr, // SOCKET

SOL_SOCKET, // level

SO_REUSEADDR, // Option

(const char *)&bValid, // Option Value

sizeof(bValid)); // Option length


bind(sockSvr, (struct sockaddr *)&addrSockSvr, sizeof(addrSockSvr));


// TCP클라이언트로 부터 접속 요구를 대기

listen(sockSvr, 5);


while (1) {


// TCP클라이언트로 부터 접속 요구 받기\tab

nlen = sizeof(addrSockclt);

sockSS = accept(sockSvr, (struct sockaddr *)&addrSockclt, &nlen);


// 문자송신

printf("%s 로부터 접속 (포트번호:%d)\n",

inet_ntoa(addrSockclt.sin_addr), // IP어드레스

ntohs(addrSockclt.sin_port)); // 포트번호


send(sockSS, "안녕", 5, 0);


closesocket(sockSS);

}


// 윈속 종료

WSACleanup();


return 0;


}


日本語形態素解析器Senを導入する

Sen はJAVAで書かれた日本語形態素解析器です。

辞書を使って日本語の文章をトークナイズします。

下は「Sen はJAVAで書かれた日本語形態素解析器です」をSenでトークナイズした例です。

f:id:knaka20blue:20080923141617j:image

  • Solrに組み込むことで、日本語文章を意味のある単語単位にトークナイズして検索・インデキシングができるようになります。
  • これにによってNグラム方式よりも精度の高い( ノイズの少ない )検索結果を得ることができます。ただし、再現率はNグラム方式より劣ります。この辺の話はちょっとややこしいので改めて。

では、れっつインストール。

ダウンロード

下からsen-1.2.2.1.zipをダウンロードして解凍する。

https://sen.dev.java.net/servlets/ProjectDocumentList?folderID=755&expandFolder=755&folderID=0

unzip sen-1.2.2.1.zip
インストール

utf-8 で使うための設定

% cd sen-1.2.2.1/conf
%vi sen.xml
<!-- charset>euc-jp</charset -->
<charset>utf-8</charset>

% vi sen-processor.xml
<!-- charset>euc-jp</charset -->
<charset>utf-8</charset>

% cd sen-1.2.2.1/dic
% vi dictionary.properties
//sen.charset=EUC-JP
sen.charset=utf-8
注) dic.charset=EUC-JPは変更しないこと
辞書のインストール
% cd sen-1.2.2.1/dic
% ant
ここでインストールされる辞書は ipadic-2.6.0 なのですが、ipadic-2.7.0が既に出ているので新し物好きな人は build.xml を修正すると幸せになれると思います。

最近はNAIST-jdicの人気も高いのでこちらをつかうのもオサレです。

インストール
% mv sen-1.2.2.1/ $HOME/local

動作確認
環境変数の設定

% vi ~/.cshrc
setenv SEN_HOME $HOME/local/sen-1.2.2.1
setenv CLASSPATH $SEN_HOME/lib/sen.jar:$CLASSPATH
bashの人は適当に読み替えてください。

動作確認

% sh $HOME/local/sen-1.2.2.1/bin/sen.sh
適当な日本語を入れてトークナイズされればおk。
「すもももももももものうち」 がお約束です。

f:id:knaka20blue:20080923144658j:image

ではでは

[Solr][Sen] 日本語形態素解析器Senを導入する その1 Senのインストール

[Solr][Sen] 日本語形態素解析器Senを導入する その2 lucene-jaのインストール

[Solr][Sen] 日本語形態素解析器Senを導入する その3 インデキシングする

[Solr][Sen] 日本語形態素解析器Senを導入する その4 再現率が高いNグラム

[Solr][Sen] 日本語形態素解析器Senを導入する その5 精度なら形態素解析

[Solr][Sen] 日本語形態素解析器Senを導入する その6 Nグラムと形態素解析には一長一短あり。目的に応じて使い分けよう


原文先: http://d.hatena.ne.jp/knaka20blue/20080922/1222104683

Perl

出処:http://gypark.pe.kr/wiki/Perl

일반:

펄 함수:

펄 모듈:

기타:


관련 링크:

 

SOA 入門

インデックス

第1回 「SOAって何?」
・ はじめてのSOA
・ SOA(Service Oriented Architecture)とは?
・ SOAでいわれるところのサービスとは?
・ 最も簡単なSOAのパターン
・ 一歩進んだSOAのパターン
・ SOAの価値
第2回 「SOAに関連する技術」
・ Webサービス
・ BPEL(Business Process Execute Language)
・ ESB(Enterprise Service Bus)
第3回 「SOAへの第一歩 - Webサービス化」
・ 既存の在庫照会プログラム
・ 既存プログラムをサービスとして利用しやすい形に変更する
・ サービスとして利用しやすい形にしたプログラムをWebサービス化する
・ インターフェース記述言語のWSDL
第4回 「ESBのお話」
・ ESBとは?
・ なぜESBが必要になるのか?
・ ESBのあるべき姿
最終回 「SOA対応のIBMソフトウェア」
・ Webサービスを実現するソフトウェア
・ BPEL対応のソフトウェア
・ ESB対応のソフトウェア
・ 最後に