在CSocket::Create函数中,将第二个参数:nSocketType 设为SOCK_DGRAM,即可,然后就可以直接使用CSocket中的成员变量了,当然要改用SendTo和ReceiveFrom这类函数,因为UDP是无连接的。

解决方案 »

  1.   

    /*this is a example of server programming.
     * 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 8765main()
    {
        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);
    }
        }
    }/*this is a example of client programming.
     * dclient.c
     *    ソケットを使用して、サーバーに接続するクライアントプログラム。
     *    DGRAM型のソケットを使う。
     *    
     *    入力された文字列をサーバーに送り、サーバーが大文字に変換したデータを
     *    受け取る。
     * 
     */#include  < stdio.h >
    #include < string.h >
    #include < sys/types.h >
    #include < sys/socket.h >
    #include < netinet/in.h >
    #include < netdb.h >#define PORT 8765main(int argc, char *argv[])
    {
        struct sockaddr_in    saddr;
        struct hostent *hp;
        int    fd;
        int    len;
        int    buflen;
        char   buf[1024];
        int    ret;    if (argc != 2){
    printf("Usage: iclient SERVER_NAME\n");
    exit(1);
        }    /*
         *  ソケットを作る。このソケットはUNIXドメインで、DGRAM型ソケット。
         */
        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
            perror("socket");
            exit(1);
        }    /* 
         * addrの中身を0にしておかないと、bind()でエラーが起こることがある
         */
        bzero((char *)&saddr, sizeof(saddr));    /*
         * ソケットに名前を入れておく
         */
        if ((hp = gethostbyname(argv[1])) == NULL) {
    perror("No such host");
    exit(1);
        }
        bcopy(hp->h_addr, &saddr.sin_addr, hp->h_length);
        saddr.sin_family = AF_INET;
        saddr.sin_port = htons(PORT);    /*
         * STREAM型のときは、ここでconnect()を呼んでいた。
         */    /*
         *  入力されたデータをソケットに書き込んでサーバーに送り、
         *  サーバーが変換して送ってきたデータを読み込む。
         */
        while (fgets(buf, 1024, stdin)) {
    buflen = strlen(buf);
    /* 送信は、sendto()で行う */
    if (sendto(fd, buf, buflen, 0, (struct sockaddr *)&saddr, sizeof(saddr)) != buflen){
        perror("sendto");
        exit(1);
    }
    /* 受信はrecvfrom()で行う */
    if ((ret = recvfrom(fd, buf, 1024, 0, NULL, &len)) < 0) {
        perror("recvfrom");
        exit(1);
    }
    buf[ret] = '\0';
            printf("%s",buf);
        }
        close(fd);
        exit(0);
    }/***
    /*this is a makefile.
    CC=gcc
    LFLAG=
    #LFLAG=-lsocket -lnsl
    CFLAG=all: dclient dserverdclient: dclient.o
    $(CC) -o $@ iclient.o $(LFLAG)
    dclient.o: dclient.c
    $(CC) -c dclient.c
    dserver: dserver.o
    $(CC) -o $@ dserver.o $(LFLAG)
    dserver.o: dserver.c
    $(CC) -c dserver.cclean:
    rm dclient dserver *.o *~