next up previous
次へ: client_daemon.c 上へ: 作成したプログラムのソースコード 戻る: 作成したプログラムのソースコード

server_daemon.c

/*server_daemon.c*/
include<stdio.h>
...省略...
int	GetLineFromPeer(char *line, int fd2) //仮引数にコネクト用のソケットディスクリプタfd2を追加
{
...省略...
for(i = 0 ; ; )
	{
	if(1 != read(fd2,line + i,1)) //client_daemonからの入力をよみこむために第一引数にfd2を指定
		continue;
	...省略...
	}
}
...省略...
int	main()
{
	char	RecvBuff[256];
	
	unsigned short port = 5683; //port番号
	int fd1;  //ソケット作成用ソケットディスクリプタ
	int fd2; //acdept用ソケットディスクリプタ
	
	struct sockaddr_in sin;
	struct sockaddr_in cin;
	int len;
	
	memset(&sin, 0, sizeof(sin));
	
	if((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) //ソケットを作成
	{
		perror("socket");
		exit(1);
	}
	
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = htons(INADDR_ANY);
	sin.sin_port = htons(port); //sockaddr構造体sinのメンバsin_portにポート番号をセット
	
	if(bind(fd1, (struct sockaddr *)&sin, sizeof(sin)) < 0) //ソケットにローカルアドレスを与える
			
	{
		perror("bind");
		exit(1);
	}
	
	if(listen(fd1, 1) < 0) //ソケット上の接続を待つ
	{
		perror("listen");
		exit(1);
	}
	
	len = sizeof(cin);
	
	if((fd2 = accept(fd1, (struct sockaddr *)&cin, &len) ) < 0) //client_daemonからの接続欲求を受け入れる
	{
		perror("accept");
		exit(1);
	}
	
	for(;;)
	{
	...省略...
		(void)GetLineFromPeer(RecvBuff, fd2);	
		/*第二引数にソケットディスクリプタfd2を指定し、client_daemonからの入力を読み込む*/
	...省略...
		if((char *)NULL != (p = strchr(RecvBuff,'=')))
		{
	...省略...		
			(void)write(fd2,SendBuff,strlen(SendBuff)); //第一引数にfd2を指定し、client_daemonに応答する
		}
	}
}



Shimabukuro Takuya 平成18年12月9日