|
以下についてアドバイスを頂ければ幸いです.
socketを用いたサーバクライアントプログラムの勉強をしております.
各クライアントから接続があったら,
サーバはクライアントに文字列"OK!"を送り,
ファイルに接続情報を書き込もうとしています.
複数クライアントからの接続に対応できるようforkを用いました.
接続情報を書き込むファイルは次のようになると想定しました.
------------------------
Parent
Child:0
Child:1
Child:2
------------------------
"Child:0", "Child:1", "Child:2"の書き込み順序が異なるかも知れないと
は思っていたのですが,
実際には,次のように"Parent"が何度も書かれてしまいました.
-------------------------
Parent
Child:0
Parent
Child:1
Parent
Child:2
Parent
Parent
Child:3
---------------------------
自分の理解では,
int main(void){
/*親プロセス*/
/**"Parent"のファイル書き込み**/
while(1){
if((pid=fork())==0{
/*子プロセス*/
/**"Child:[0-3]の書き込み**/
}
else if(pid>0){
/*親プロセスの続き*/
}
}
}
と思っていて,while文の前にある"Parent"の書き込みが
複数回起こり得ないと思っているのですが,
何を勘違いしているのか見当がついておりません.
何かアドバイスを頂ければ幸いです.
通信は問題なく行われているようですので,
クライアントプログラムは掲載せず,
サーバプログラムだけ以下に示させて頂きます.
(必要ならばクライアントプログラムも掲載させて頂きます)
なお,環境はFreeBSD 4.11R, gcc-2.95.4です.
よろしくお願いします.
サーバ側プログラム↓(ここから最後まで)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 10000
#define BUF_LEN 64
int main(void){
int soc_waiting, soc;
struct sockaddr_in me;
int pid, cnt;
FILE *fp;
if((fp=fopen("receive.txt", "w"))==NULL){
perror("fopen");
exit(1);
}
fprintf(fp, "Parent\n");
if((soc_waiting = socket(AF_INET, SOCK_STREAM, 0))<0){
perror("socket");
exit(1);
}
memset((char *)&me,0,sizeof(me));
me.sin_addr.s_addr = htonl(INADDR_ANY);
me.sin_port = htons(PORT);
me.sin_family = AF_INET;
if(bind(soc_waiting, (struct sockaddr *)&me, sizeof(me))==-1){
perror("bind");
exit(1);
}
listen(soc_waiting,1);
cnt=0;
while(1){
soc = accept(soc_waiting,NULL,NULL);
if((pid=fork())==-1){
perror("fork");
exit(1);
}
else if(pid==0){
close(soc_waiting);
fprintf(fp, "Child:%d\n", cnt);
send(soc, "OK!", BUF_LEN, 0);
exit(0);
}
else{
close(soc);
}
if(cnt>=3) break;
cnt++;
}
fclose(fp);
return 0;
}
|