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??

        }

    }

    }

  • 相关阅读:
    【转】PHP使用共享内存进程间通信
    【转】php进程间通信--有名管道
    【转】代理模式-php白话示例
    [转]设计的核心任务之三:确保正交性
    pc主板支持独显和集显视频输出
    OpenGL核心技术之抗锯齿
    读书:有钱人想的和你不一样
    js 文本相似度
    js实现获得QQ截图或者微信截图后剪切板的内容clipboardData
    【转】chrome浏览器F12 Network中Timing参数含义
  • 原文地址:https://www.cnblogs.com/titer1/p/2014230.html
Copyright © 2011-2022 走看看