// echo_server.cc
#include <fcntl.h> // fcntl
#include <stdlib.h> // exit
#include <sys/socket.h> // socket
#include <netinet/in.h> // sockaddr_in
#include <strings.h> // bzero
#include <arpa/inet.h> // inet_addr
#include <unistd.h> // read
#include <stdio.h> // perror
#include <poll.h>
#include <iostream>
int main()
{
std::cout << "start poll echo server..." << std::endl;
static const int max_back_log = 10;
static const int max_poll_fd = 2;
struct pollfd fds[max_poll_fd];
for(int i = 0; i < max_poll_fd; ++i)
{
fds[i].fd = -1;
}
int listenfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == listenfd)
{
perror("socket");
exit(1);
}
int option_name = 1;
if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &option_name, sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
struct sockaddr_in serveraddr;
bzero(&serveraddr,sizeof(sockaddr_in));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9876);
inet_aton("127.0.0.1",&(serveraddr.sin_addr));
if( -1 == bind(listenfd,(sockaddr*)&serveraddr,sizeof(sockaddr_in)))
{
perror("bind");
exit(1);
}
if( -1 == listen(listenfd,max_back_log))
{
perror("bind");
exit(1);
}
int cur_poll_fd_num = 0;
fds[0].fd = 0;
fds[0].events = POLLIN;
++cur_poll_fd_num;
fds[1].fd = listenfd;
fds[1].events = POLLIN;
++cur_poll_fd_num;
int timeout_msecs = 50000;
int connectfd = 0;
struct sockaddr_in clientaddr;
socklen_t client_addr_len;
int read_data = 0;
int send_size = 0;
int read_size = 0;
while(1)
{
int ret = poll(fds,cur_poll_fd_num,timeout_msecs);
if(-1 == ret)
{
perror("poll");
exit(1);
}
else if(0 == ret)
{
perror("time out");
continue;
}
for(int i = 0; i <cur_poll_fd_num; ++i)
{
if(fds[i].revents & POLLIN)
{
if(0 == fds[i].fd)
{
std::cout << read_size << " fds[i].fd = 0 " << read_data << std::endl;
}
else if(listenfd == fds[i].fd)
{
connectfd = accept(listenfd,(sockaddr*)&clientaddr,&client_addr_len);
if(-1 == connectfd)
{
perror("accept");
continue;
}
fds[cur_poll_fd_num].fd = connectfd;
fds[cur_poll_fd_num].events = POLLIN;
++cur_poll_fd_num;
std::cout << "new connection coming at " << inet_ntoa(clientaddr.sin_addr) << ": " << ntohs(clientaddr.sin_port) << std::endl;
}
else
{
if((read_size = read(fds[i].fd,(void*)&read_data,sizeof(int))) < 0 )
{
perror("read");
}
else
{
std::cout << read_size << " bytes data read: " << read_data << std::endl;
}
if((send_size = write(fds[i].fd,(void*)&read_data,sizeof(int))) < 0 )
{
perror("write");
}
else
{
std::cout << send_size << " bytes data send: " << read_data << std::endl;
}
}
}
}
}
return 0;
}
// echo_client.cc
#include <stdlib.h> // exit
#include <netinet/in.h> // sockaddr_in
#include <strings.h> // bzero
#include <arpa/inet.h> // inet_addr
#include <sys/socket.h>
#include <iostream>
int main()
{
int sock = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sock)
{
std::cout << "error at socket"<<std::endl;
exit(1);
}
struct sockaddr_in clientaddr;
clientaddr.sin_family = AF_INET;
clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
clientaddr.sin_port = htons(9876);
int res = connect(sock,(sockaddr*)&clientaddr,sizeof(sockaddr_in));
if(-1 == res)
{
std::cout << "error at connect"<<std::endl;
exit(1);
}
static int send_data = 1;
for(;;)
{
int send_bytes = send(sock,(void*)&send_data,sizeof(int),0);
if(-1 != send_bytes)
{
std::cout << send_bytes << " bytes data send: " << send_data++ << std::endl;
}
int recv_data = 0;
int recv_bytes = recv(sock,(void*)&recv_data,sizeof(int),0);
if(-1 != recv_bytes)
{
std::cout << recv_bytes << " bytes data recv: " << recv_data << std::endl;
}
sleep(1);
}
}