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

    }

}

}

原文地址:https://www.cnblogs.com/titer1/p/2014230.html