zoukankan      html  css  js  c++  java
  • 客户端-服务器(client-server) 贾文龙

    //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. ");
                   
    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]="已发送成功! ";
           
    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 ",
                                   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 ", 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);
                                           
                                                                                   
                                   
    }
                           
    }
                   
    }
           
    }

    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(846) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    Using X++ Code Create Meeting Request in Outlook
    程序员的健康
    LinkType Property
    C#一些实用的,容易被遗忘的特性,经验和技巧
    如何面试程序员(转)
    uniapp:授权(以微信小程序为例)
    C#(Windows窗口):窗口最大化、最小化
    Docker 安装和启用Tomcat
    Docker 安装和启用ngnix
    Uniapp: 扫码(以微信小程序为例)
  • 原文地址:https://www.cnblogs.com/ztguang/p/12647511.html
Copyright © 2011-2022 走看看