▼ 2007/06/10(日) ソケットプログラミングな件
さて、この土日は天気も悪かったので、家に引きこもって、
Cでソケットプログラミングをして遊んでいたわけですが、ちょっとマルチタスク型の
サーバプログラムを作ってて、それにスレッドを採用したわけですが、
どうにも、コンパイルが通らないんですよ・・・
以下のようなエラーが出てしまう。
--snip--
undefined reference to `pthread_create'
undefined reference to `pthread_detach'
...
--snip--
色々と調べたところ、-lpthread のオプション付けてコンパイルすればOKみたいなので、
試しにやってみたら、すんなりと通りましたよ・・・
Makefile使用する場合は、以下みたいな感じで。
(hoge1.o, hoge2.o, hoge3.o, hoge4.o をリンクして、a.outを作成する場合)
CFLAGS = -lpthread
PROGRAM = a.out
OBJS = hoge1.o hoge2.o hoge3.o hoge4.o
$(PROGRAM): $(OBJS)
$(CC) -o $@ $^ $(CFLAGS) ←コマンドの前の空白は、\t(タブ)
.c.o:
$(CC) -c $< ←コマンドの前の空白は、\t(タブ)
clean:
$(RM) $(OBJS) $(PROGRAM) ←コマンドの前の空白は、\t(タブ)
あとは、make って叩けば完了です。便利だよねー。
-----------------
さて、上でやってたプログラムなわけですが、コンパイルは上手くいったものの
正常に動いてくれなくてね・・・これだからツンデレC言語は・・・
「あ、あんたなんかの為にちゃんと動いてやらないんだから!」
「コンパイル通ったくらいでいい気にならないでよねっ!」
でも、数々の試練を乗り越えて、デレデレモードに突入させちゃえば、
優秀なスピードで動いてくれるわけですよ。柔軟性も高いし。
C言語・・・いや、ツンデレ最高!
さて、ツンデレの話じゃなくて、上のプログラムの件なんですが、
同じようなプログラムをforkバージョンでも作ってて、そのforkするとこ以外は、
使いまわしのモジュールなんだよね・・・
だから、動いてくれそうなもんなんだけど。
それに見てるとスレッドの部分でやられてるというよりは、
それ以前でやられてるっぽいし・・・
試しに、このサーバプログラムがどんな動きをしてるのか、straceで走査。
--snip--
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
bind(3, {sa_family=AF_INET, sin_port=htons(60576), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 5) = 0
accept(3,
と、まぁ、まだクライアントから接続されてないので、acceptのとこで止まってて
正常なわけですが、クライアントからアクセスしても、ここから一向に状況が(ry なわけ。
クライアントからの接続が上手く来てないっぽいので、クライアント側でもstrace で走査。
--snip--
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(5555), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
--snip
予想通り、connectが上手く行ってないみたいで。
・・・って、今この日記書いててよくよく見るとさ、サーバプログラムは一応、ポートは
5555番を使うようにしてるんだけど、上のstrace の結果見ると、
60576番になってるしw
こりゃ、connect上手くいくわけねーーwww
bind(3, {sa_family=AF_INET, sin_port=htons(60576), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
試しに、クライアントプログラムのほうで、60576番を指定してやったら、
無事にできましたよ。
まぁ、そのなんだ。strace は便利だし、重要だよってことでまとめていいよね?ね?
本当に日記書く前にどうして気づかなかったのかと、小一時間・・・
でも、本当にstrace便利だな・・・
- TB-URL http://chibilog.name/020/tb/
