/client.c/
#include <stdio.h>
#include <string.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#define SPORT 8888
#define SIZE 100
int main(void)
{
int sockfd, clientfd;
struct sockaddr_in sockServer;
struct timeval tv;
fd_set readfds;
int readlen, writelen;
char buffer[SIZE];
time_t timet;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("create socket failed!\n");
return -1;
}
bzero(&sockServer, 0);
sockServer.sin_family = AF_INET;
sockServer.sin_port = htons(SPORT);
sockServer.sin_addr.s_addr = htonl(INADDR_ANY);
if(connect(sockfd, (struct sockaddr *)&sockServer, sizeof(struct sockaddr_in)) < 0)
{
perror("connect failed!\n");
close(sockfd);
}
while(1)
{
int ret;
FD_ZERO(&readfds);
FD_SET(1, &readfds);
FD_SET(sockfd, &readfds);
tv.tv_usec = 0;
tv.tv_sec = 60;
ret = select(sockfd+1, &readfds, NULL, NULL, &tv);
switch(ret)
{
case 0:
printf("select timeout!\n");
break;
case -1:
perror("select return failed!\n");
goto closesocket;
default:
if(FD_ISSET(sockfd, &readfds) > 0)
{
memset(buffer, 0, SIZE);
readlen = read(sockfd, buffer, SIZE);
if(readlen < 0)
{
perror("read data failed!\n");
goto closesocket;
}
time(&timet);
printf("Opposite: %s %s", "Server", ctime(&timet));
strcat(buffer, "\n");
writelen = write(0, buffer, readlen + 1);
if(writelen < 0)
{
perror("write data failed!\n");
goto closesocket;
}
}
if(FD_ISSET(1, &readfds) > 0)
{
time(&timet);
printf("Owner: %d %s\n", sockfd, ctime(&timet));
memset(buffer, 0, SIZE);
readlen = read(1, buffer, SIZE);
if(readlen < 0)
{
perror("read data failed!\n");
goto closesocket;
}
writelen = write(sockfd, buffer, readlen);
if(writelen < 0)
{
perror("write data failed!\n");
goto closesocket;
}
}
}
closesocket:
close(clientfd);
}
close(sockfd);
return 0;
}
/server.c/
#include <stdio.h>
#include <string.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#define SPORT 8888
#define BACKLOG 5
#define SIZE 100
int main(void)
{
int sockfd, clientfd;
struct sockaddr_in sockServer, sockClient;
struct timeval tv;
fd_set readfds, writefds;
int readlen, writelen;
char buffer[SIZE];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("create socket failed!\n");
return -1;
}
bzero(&sockServer, 0);
sockServer.sin_family = AF_INET;
sockServer.sin_port = htons(SPORT);
sockServer.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&sockServer, sizeof(struct sockaddr_in)) < 0)
{
perror("bind socket failed!\n");
return -1;
}
if(listen(sockfd, BACKLOG) < 0)
{
perror("listen failed!\n");
}
printf("Server is listening ......\n");
while(1)
{
int len = sizeof(struct sockaddr_in);
int ret;
time_t timet;
clientfd = accept(sockfd, (struct sockaddr *)&sockClient, &len);
if(clientfd < 0)
{
perror("accept failed!\n");
return -1;
}
for(;;)
{
FD_ZERO(&readfds);
FD_SET(1, &readfds);
FD_SET(clientfd, &readfds);
tv.tv_usec = 0;
tv.tv_sec = 60;
ret = select(clientfd+1, &readfds, NULL, NULL, &tv);
switch(ret)
{
case 0:
printf("select timeout!\n");
break;
case -1:
perror("select return failed!\n");
goto closesocket;
default:
if(FD_ISSET(clientfd, &readfds) > 0)
{
memset(buffer, 0, SIZE);
readlen = read(clientfd, buffer, SIZE);
if(readlen < 0)
{
perror("read data failed!\n");
goto closesocket;
}
time(&timet);
printf("Opposite: %d %s", clientfd, ctime(&timet));
strcat(buffer, "\n");
writelen = write(0, buffer, readlen+1);
if(writelen < 0)
{
perror("write data failed!\n");
goto closesocket;
}
}
if(FD_ISSET(1, &readfds) > 0)
{
time(&timet);
printf("Owner: %d %s\n", sockfd, ctime(&timet));
memset(buffer, 0, SIZE);
readlen = read(1, buffer, SIZE);
if(readlen < 0)
{
perror("read data failed!\n");
goto closesocket;
}
writelen = write(clientfd, buffer, readlen);
if(writelen < 0)
{
perror("write data failed!\n");
goto closesocket;
}
}
}
}
closesocket:
close(clientfd);
}
close(sockfd);
return 0;
}