TCP/UDPソケットプログラミング(その1)

戻る

::::::::::::::
Makefile
::::::::::::::
# $Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $

CC=gcc
LFLAG=
#LFLAG=-lsocket -lnsl
CFLAG=

all:	udpclient udpserver inetclient inetserver

udpclient: udpclient.o 
	$(CC) -o $@ udpclient.o $(LFLAG)

udpclient.o: udpclient.c udp-common.h
	$(CC) -c udpclient.c

udpserver: udpserver.o 
	$(CC) -o $@ udpserver.o $(LFLAG)

udpserver.o: udpserver.c udp-common.h
	$(CC) -c udpserver.c

inetclient: inetclient.o
	$(CC) -o $@ inetclient.o $(LFLAG)

inetclient.o: inetclient.c inet-common.h
	$(CC) -c inetclient.c

inetserver: inetserver.o
	$(CC) -o $@ inetserver.o $(LFLAG)

inetserver.o: inetserver.c inet-common.h
	$(CC) -c inetserver.c

clean:
	rm -f udpclient udpserver inetclient inetserver *.o *~ *.bak
 
::::::::::::::
inet-common.h
::::::::::::::
/*
* $Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $
*/
#define PORT 18782
::::::::::::::
inetclient.c
::::::::::::::
/*
 * $Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $ 
 */

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#include "inet-common.h"

main (int argc, char *argv[])
{
    struct sockaddr_in addr;
    struct hostent *hp;
    int sock;
    int len;
    char buf[1024];
    int ret;

    if (argc != 2) {
        printf ("Usage: %s SERVER_NAME\n", argv[0]);
        exit (1);
    }

    if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
        perror ("socket");
        exit (1);
    }

    bzero ((char *) &addr, sizeof (addr));

    if ((hp = gethostbyname (argv[1])) == NULL) {
        perror ("No such host");
        exit (1);
    }
    bcopy (hp->h_addr, &addr.sin_addr, hp->h_length);
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);

    if (connect (sock, (struct sockaddr *) &addr, sizeof (addr)) < 0) {
        perror ("connect");
        exit (1);
    }
    while (fgets (buf, 1024, stdin)) {
        write (sock, buf, 1024);
        ret = read (sock, buf, 1024);
        buf[ret] = '\0';

        printf ("%s", buf);
    }
    close (sock);
    exit (0);
}
::::::::::::::
inetserver.c
::::::::::::::
/*
$Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $
 */

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>	

#include "inet-common.h"

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

    if ((fd_one = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
        perror ("socket");
        exit (1);
    }

    bzero ((char *) &saddr, sizeof (saddr));

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = INADDR_ANY;
    saddr.sin_port = htons (PORT);

    if (bind (fd_one, (struct sockaddr *) &saddr, sizeof (saddr)) < 0) {
        perror ("bind");
        exit (1);
    }

    if (listen (fd_one, 1) < 0) {
        perror ("listen");
        exit (1);
    }

    len = sizeof (caddr);
    if ((fd_two = accept (fd_one, (struct sockaddr *) &caddr, &len)) < 0) {
        perror ("accept");
        exit (1);
    }
    close (fd_one);

    ret = read (fd_two, buf, 1024);
    while (strcmp (buf, "quit\n") != 0) {
        for (i = 0; i < ret; i++) {
            if (isalpha (buf[i]))
                buf[i] = toupper (buf[i]);
        }
        write (fd_two, buf, 1024);
        ret = read (fd_two, buf, 1024);
    }

    close (fd_two);
}
::::::::::::::
udp-common.h
::::::::::::::
/**
* $Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $
*/
#define PORT 18418
::::::::::::::
udpclient.c
::::::::::::::
/*
* $Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $
 */

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#include "udp-common.h"

main (int argc, char *argv[])
{
    struct sockaddr_in saddr;
    struct hostent *hp;
    int sock;
    int len;
    int buflen;
    char buf[1024];
    int ret;

    if (argc != 2) {
        printf ("Usage: %s [SERVER_NAME]\n", argv[0]);
        exit (1);
    }

    if ((sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror ("socket");
        exit (1);
    }

    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);

    while (fgets (buf, 1024, stdin)) {
        buflen = strlen (buf);
        if (sendto (sock, buf, buflen, 0, (struct sockaddr *) &saddr, sizeof (saddr)) != buflen) {
            perror ("sendto");
            exit (1);
        }

        if ((ret = recvfrom (sock, buf, 1024, 0, NULL, &len)) < 0) {
            perror ("recvfrom");
            exit (1);
        }
        buf[ret] = '\0';
        printf ("%s", buf);
    }
    close (sock);
    exit (0);

}
::::::::::::::
udpserver.c
::::::::::::::
/*
$Id: socket.html,v 1.1 2009/06/22 16:12:26 kishi Exp kishi $
 */

#include  <stdio.h>
#include  <string.h>
#include  <sys/types.h>
#include  <sys/socket.h>
#include  <netinet/in.h>

#include "udp-common.h"

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

    if ((fd_one = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror ("socket");
        exit (1);
    }

    bzero ((char *) &saddr, sizeof (saddr));

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = INADDR_ANY;
    saddr.sin_port = htons (PORT);

    if (bind (fd_one, (struct sockaddr *) &saddr, sizeof (saddr)) < 0) {
        perror ("bind");
        exit (1);
    }

    len = sizeof (caddr);

    while (1) {
        if ((ret = recvfrom (fd_one, buf, 1024, 0, (struct sockaddr *) &caddr, &len)) < 0) {
            perror ("recvfrom");
            exit (1);
        }

        /** modify LOWERCASE to UPPERCASE */
        for (i = 0; i < ret; i++) {
            if (isalpha (buf[i]))
                buf[i] = toupper (buf[i]);
        }

        if (sendto (fd_one, buf, ret, 0, (struct sockaddr *) &caddr, len) != ret) {
            perror ("sendto");
            exit (1);
        }
    }
}
戻る inserted by FC2 system