目标:
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??
}
}
}