• unp_exam_要点.doc


    目标:

    C CONNECT-->S: SERVER SAYS: HELLO, IP [GUEST IP]

    C--> S: DOING ECHO....

    C DISCONNECT -->S: SERVER SAYS: BYE ,IP[GUEST IP]


     

    要点:

    取到guest ip

    注意放置 三次握手的位置

    放置结束的位置

    还有清空的位置

    (三个要点,看看代码中标示黄色就是拉。)

     

    服务器代码:(客户端给出)

     

     

    #include <stdio.h>

    #include <sys/types.h>

    #include <sys/socket.h>

    #include <netinet/in.h>

    #include <arpa/inet.h>

    #include <stdlib.h>

    #include <string.h>

    #include <sys/epoll.h>

     

    #define BUFFER_SIZE 40

    #define MAX_EVENTS 10

    int main(int argc, char * argv[]) {//66 list backgroud

        int server_sockfd;// ·þÎñÆ÷¶ËÌלÓ×Ö

        int client_sockfd;// ¿Í»§¶ËÌלÓ×Ö

        int len;

        struct sockaddr_in my_addr; // ·þÎñÆ÷ÍøÂçµØÖ·œá¹¹Ìå

        struct sockaddr_in remote_addr; // ¿Í»§¶ËÍøÂçµØÖ·œá¹¹Ìå

        int sin_size;

        char buf[BUFFER_SIZE]; // ÊýŸÝŽ«Ë͵Ļº³åÇø

        char bufC[BUFFER_SIZE]; //

     

        memset(&my_addr, 0, sizeof(my_addr));

        my_addr.sin_family = AF_INET;

        my_addr.sin_addr.s_addr = INADDR_ANY;

        my_addr.sin_port = htons(1234); //todo 1234 for exam

        //todo argv[1]

        //

        //create my socket

        //

        if ((server_sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {

     

            return -1;

        }

        //

        //bind the socket

        //

        if (bind(server_sockfd, (struct sockaddr *) &my_addr,

                sizeof(struct sockaddr)) < 0) {

            return -2;

        }

        //

        //listen the socket

        //

        listen(server_sockfd, 5);

        sin_size = sizeof(struct sockaddr_in);

        //66:key

        int epoll_fd;

        //

        //serve the client

        //

        epoll_fd = epoll_create(MAX_EVENTS);

     

        struct epoll_event ev;

        struct epoll_event events[MAX_EVENTS];//66KEY

        ev.events = EPOLLIN;

        ev.data.fd = server_sockfd;

     

        if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_sockfd, &ev) == -1) {

            printf("epoll_ctl \n");

            exit(0);

        }

     

        int nfds;

    while (1) {

        //66:HERE, 2nd use epoll_fd

        nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);

     

        int i;

        for (i = 0; i < nfds; i++) {

     

            if (events[i].data.fd == server_sockfd) {

                //

                //accept

                //

                if ((client_sockfd = accept(server_sockfd,

                                        (struct sockaddr *) &remote_addr,

                                        &sin_size)) < 0) {

                }

                //66key...

                ev.events = EPOLLIN;

                ev.data.fd = client_sockfd;

                //

                //

                //

                                         //todo:链接后提示

                //

                bzero(buf, sizeof(buf));

                bzero(bufC, sizeof(bufC));

     

                inet_ntop(AF_INET, &remote_addr.sin_addr, buf, sizeof(buf));

                sprintf(bufC,"Hello, connection from %s\n",buf);

     

                write(client_sockfd, bufC, sizeof(bufC));

     

                if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD,

                                client_sockfd, &ev)== -1) {}

     

            } else {

                //todo...

                                         //清空buffer,

                //是必备的,dw说 放在读之前

                    bzero(buf, sizeof(buf));

                    bzero(bufC, sizeof(bufC));

     

     

                if (read(client_sockfd, buf, sizeof(buf)) != 0) {

                    printf("get:%s", buf);

                    write(client_sockfd, buf, sizeof(buf));

                }

                else {

                    //      close(client_sockfd);

                    //todo

     

                                              //断链前的处理

                    inet_ntop(AF_INET, &remote_addr.sin_addr, buf, sizeof(buf));

                    sprintf(bufC,"bye,  %s\n",buf);

                    write(events[i].data.fd , bufC, sizeof(bufC)); //key

     

                    close(events[i].data.fd );//key

    //后住:老师说shutdown是客户端调用。 还有这里使用的 fd,不是 client_sockfd,而是当前

     

     

                    //shutdown(client_sockfd,SHUT_WR);

     

                    printf("close connfd \n");

                }

            }

        close(server_sockfd);//todo??

        }

    }

    }

  • 相关阅读:
    Linux 进程学习(四) sigaction 函数
    Netty 编解码奥秘
    我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:护国小将,邀请大家一同入驻:https://www.oschina.net/sharingplan/apply
    Netty数据如何在 pipeline 中流动
    PLM系统安装四:主卷服务安装(FSC缓存服务器plm4IP:42.20)
    Linux系统信息和进程相关命令(CPU,内存,进程)
    SAN交换机配置的备份还原,固件升级
    san交换机的级联
    PLM系统安装五(2):Corporate服务安装plm1IP:42.106
    第三步:服务器虚拟化XenServer实施部署文档
  • 原文地址:https://www.cnblogs.com/titer1/p/2014230.html
Copyright © 2020-2023  润新知