/*
 * dserver.c
 *   クライアントからの接続要求を受け付けるサーバープログラム。
 *   DGRAM型のソケットを使う。
 *   
 *   クライアントから送られてきた文字列を大文字に変換して送り返す。
 */

#include  < stdio.h >
#include  < string.h >
#include  < sys/types.h >
#include  < sys/socket.h >
#include  < netinet/in.h >  /* #include < sys/un.h >の代わり */


#define PORT 8765

main()
{
    int    i;
    int    fd1, fd2;
    struct sockaddr_in    saddr;
    struct sockaddr_in    caddr;
    int    len;
    int    ret;
    char   buf[1024];


    /*
     * ソケットを作る。このソケットはUNIXドメインで、DGRAM型ソケット。
     */
    if ((fd1 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
	perror("socket");
	exit(1);
    }

    /* 
     * saddrの中身を0にしておかないと、bind()でエラーが起こることがある
     */
    bzero((char *)&saddr, sizeof(saddr));

    /*
     * ソケットの名前を入れておく
     */
    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = INADDR_ANY;
    saddr.sin_port = htons(PORT);

    /*
     * ソケットにアドレスをバインドする。
     */
    if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){
	perror("bind");
	exit(1);
    }
    
    /*
     * STREAM型の場合はここでlisten()とaccept()を呼んでいた。
     */

    len = sizeof(caddr);

    while (1) {
	/* recvfromでクライアントからのデータを受信。
	 * bufの中の小文字を大文字に変換する 。
         */
	if ((ret = recvfrom(fd1, buf, 1024, 0, (struct sockaddr *)&caddr, &len)) < 0){
	    perror("recvfrom");
	    exit(1);
	}
	for (i=0; i < ret; i++) {
	    if (isalpha(buf[i]))
		buf[i] = toupper(buf[i]);
	    }	
	/* 変換したデータをクライアントに送り返す */

	/* 送信はsendto()で行う */
	if (sendto(fd1, buf , ret, 0, (struct sockaddr *)&caddr, len) != ret){
	    perror("sendto");
	    exit(1);
	}
    }
}