//09嵌入式-贾文龙



#include

#include

#include

void perr_exit(const char *s)

{

        perror(s);

        exit(1);

} int Accept(int fd, struct sockaddr *sa, socklen_t * salenptr)

{

        int n;

      again:if ((n = accept(fd, sa, salenptr)) < 0) {

                if ((errno == ECONNABORTED) || (errno == EINTR))

                        goto again;

                else

                        perr_exit("accept error");

        }

        return n;

}

void Bind(int fd, const struct sockaddr *sa, socklen_t salen)

{

        if (bind(fd, sa, salen) < 0)

                perr_exit("bind error");

}

void Connect(int fd, const struct sockaddr *sa, socklen_t salen)

{

        if (connect(fd, sa, salen) < 0)

                perr_exit("connect error");

}

void Listen(int fd, int backlog)

{

        if (listen(fd, backlog) < 0)

                perr_exit("listen error");

}

int Socket(int family, int type, int protocol)

{

        int n;

        if ((n = socket(family, type, protocol)) < 0)

                perr_exit("socket error");

        return n;

}


ssize_t Read(int fd, void *ptr, size_t nbytes)

{

        ssize_t n;

      again:if ((n = read(fd, ptr, nbytes)) == -1) {

                if (errno == EINTR)

                        goto again;

                else

                        return -1;

        }

        return n;

}


ssize_t Write(int fd, const void *ptr, size_t nbytes)

{

        ssize_t n;

      again:if ((n = write(fd, ptr, nbytes)) == -1) {

                if (errno == EINTR)

                        goto again;

                else

                        return -1;

        }

        return n;

}

void Close(int fd)

{

        if (close(fd) == -1)

                perr_exit("close error");

}




/* client.c */

#include

#include

#include

#include

#include "wrap.h"

#include

#include

#define MAXLINE 80

#define SERV_PORT 8000

int main(int argc, char *argv[])

{

        struct sockaddr_in servaddr;

        char buf[MAXLINE];

        int sockfd, n;

        pid_t pid;

        sockfd = Socket(AF_INET, SOCK_STREAM, 0);

        bzero(&servaddr, sizeof(servaddr));

        servaddr.sin_family = AF_INET;

        inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

        servaddr.sin_port = htons(SERV_PORT);

        Connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));



        if (fgets(buf, MAXLINE, stdin) != NULL)

        Write(sockfd, buf, strlen(buf));



       pid=fork();

       if (pid == 0)

       {

       while(1)

       {

        if (fgets(buf, MAXLINE, stdin) != NULL)


                Write(sockfd, buf, strlen(buf));

        }

        }

       else

       {

       while(1)

       {

       n = Read(sockfd, buf, MAXLINE);

                if (n == 0)

                        printf("the other side has been closed.\n");

                else

                        Write(STDOUT_FILENO, buf, n);

                        }

                        }


        Close(sockfd);

        return 0;


}






/* server.c */

#include

#include

#include

#include

#include "wrap.h"

#define MAXLINE 80

#define SERV_PORT 8000

int main(int argc, char **argv)

{

        int i, maxi, maxfd, listenfd, connfd, sockfd;

        int nready, client[FD_SETSIZE];

        ssize_t n;

        fd_set rset, allset;

        char buf[MAXLINE];

        char out[50]="已发送成功!\n";

        char str[INET_ADDRSTRLEN];

        socklen_t cliaddr_len;

        struct sockaddr_in cliaddr, servaddr;

        listenfd = Socket(AF_INET, SOCK_STREAM, 0);

        bzero(&servaddr, sizeof(servaddr));

        servaddr.sin_family = AF_INET;

        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

        servaddr.sin_port = htons(SERV_PORT);

        Bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

        Listen(listenfd, 20);

        maxfd = listenfd;       /* initialize */

        maxi = -1;              /* index into client[] array */

        for (i = 0; i < FD_SETSIZE; i++)

                client[i] = -1; /* -1 indicates available entry */

        FD_ZERO(&allset);

        FD_SET(listenfd, &allset);

        for (;;) {


                rset = allset;  /* structure assignment */

                nready = select(maxfd + 1, &rset, NULL, NULL, NULL);

                if (nready < 0)

                        perr_exit("select error");




                if (FD_ISSET(listenfd, &rset)) {        /* new client connection */

                        cliaddr_len = sizeof(cliaddr);

                        connfd =

                            Accept(listenfd, (struct sockaddr *) &cliaddr,

                                   &cliaddr_len);

                        printf("received from %s at PORT %d\n",

                               inet_ntop(AF_INET, &cliaddr.sin_addr, str,

                                         sizeof(str)),

                               ntohs(cliaddr.sin_port));

                        for (i = 0; i < FD_SETSIZE; i++)

                                if (client[i] < 0) {

                                        client[i] = connfd;     /* save descriptor */

                                        break;

                                }

                        if (i == FD_SETSIZE) {

                                fputs("too many clients\n", stderr);

                                exit(1);

                        }

                        FD_SET(connfd, &allset);        /* add new descriptor to set */

                        if (connfd > maxfd)

                                maxfd = connfd; /* for select */

                        if (i > maxi)

                                maxi = i;       /* max index in client[] array */

                        if (--nready == 0)

                                continue;       /* no more readable descriptors */

                }

                for (i = 0; i <= maxi; i++) {   /* check all clients for data */

                        if ((sockfd = client[i]) < 0)

                                continue;

                        if (FD_ISSET(sockfd, &rset)) {

                                if ((n = Read(sockfd, buf, MAXLINE)) == 0) {    /* connection closed by client */

                                        Close(sockfd);

                                        FD_CLR(sockfd, &allset);

                                        client[i] = -1;

                                }

                                                int cc=0;

                                        for (cc=0; cc < 1000; cc++)

                                        {

                                        if(sockfd == client[cc])


                                        Write(sockfd, out, 50);

                                        else

                                        Write(client[cc],buf, n);


                                        }

                                        Write(1, buf, n);



                                }

                        }

                }

        }