ようこそゲストさん

chibilog

2007/06/10(日) ソケットプログラミングな件

はてブ情報 はてブに登録 はてブ数 2007/06/10 21:12 未分類

さて、この土日は天気も悪かったので、家に引きこもって、
Cでソケットプログラミングをして遊んでいたわけですが、ちょっとマルチタスク型の
サーバプログラムを作ってて、それにスレッドを採用したわけですが、
どうにも、コンパイルが通らないんですよ・・・

以下のようなエラーが出てしまう。

--snip--
undefined reference to `pthread_create'
undefined reference to `pthread_detach'
...

--snip--

色々と調べたところ、-lpthread のオプション付けてコンパイルすればOKみたいなので、
試しにやってみたら、すんなりと通りましたよ・・・


$ gcc -o a.out hoge1.c hoge2.c hoge3.c hoge4.c -lpthread

Makefile使用する場合は、以下みたいな感じで。
(hoge1.o, hoge2.o, hoge3.o, hoge4.o をリンクして、a.outを作成する場合)


CC = gcc
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で走査。


$ strace -f -F ./a.out

--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 で走査。


$ strace -f -F ./client_prog

--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便利だな・・・



名前:  非公開コメント   

URL(任意):
  • TB-URL  http://chibilog.name/020/tb/