zoukankan      html  css  js  c++  java
  • 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??

        }

    }

    }

  • 相关阅读:
    too many open files linux服务器 golang java
    fasthttp 文档手册
    syncer.go
    grpc.go
    stm.go
    session.go
    mutex.go
    [HTML5]label标签使用以及建议
    禁止使用finalize方法
    [支付宝]手机网站支付快速接入
  • 原文地址:https://www.cnblogs.com/titer1/p/2014230.html
Copyright © 2011-2022 走看看