#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
void sig_chld(int signo)
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
{
printf("child %d terminated\n", pid);
}
return;
}
void str_echo(int sockfd)
{
char buffer[100];
int n;
memset(buffer, 0, 100);
while((n = read(sockfd, buffer, 100)) > 0)
{
buffer[n+1]='\0';
printf("%s\n", buffer);
write(sockfd, buffer, strlen(buffer));
memset(buffer, 0, 100);
}
}
int main()
{
int listenfd, connfd;
struct sockaddr_in server_sockaddr, client_sockaddr;
socklen_t clilen;
pid_t pid;
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf(stderr, "Socket failed\n");
exit(EXIT_FAILURE);
}
bzero(&server_sockaddr, sizeof(server_sockaddr));
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(9877);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)) == -1)
{
fprintf(stderr, "Bind failed\n");
exit(EXIT_FAILURE);
}
if(listen(listenfd, 5) == -1)
{
fprintf(stderr, "Listen failed\n");
exit(EXIT_FAILURE);
}
signal(SIGCHLD, sig_chld);
while(1)
{
clilen = sizeof(client_sockaddr);
if((connfd = accept(listenfd, (struct sockaddr*)&client_sockaddr, &clilen)) < 0)
{
if(errno == EINTR)
continue;
else
{
fprintf(stderr, "Accept failed\n");
exit(EXIT_FAILURE);
}
}
if((pid = fork()) == 0)
{
close(listenfd);
str_echo(connfd);
close(connfd);
exit(0);
}
close(connfd);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/select.h>
#include<sys/time.h>
#include<sys/types.h>
int max(int fd1, int fd2)
{
return fd1>fd2?fd1:fd2;
}
void str_cli(int sockfd)
{
int maxfdp1;
fd_set rset;
char send_buffer[100], receive_buffer[100];
FD_ZERO(&rset);
memset(send_buffer, 0, 100);
memset(receive_buffer, 0, 100);
while(1)
{
FD_SET(fileno(stdin), &rset);
FD_SET(sockfd, &rset);
maxfdp1 = max(fileno(stdin), sockfd) + 1;
select(maxfdp1, &rset, NULL, NULL, NULL);
if(FD_ISSET(sockfd, &rset))
{
if(read(sockfd, receive_buffer, 100) == 0)
{
fprintf(stderr, "server terminated prematurely");
exit(EXIT_FAILURE);
}
printf("%s\n", receive_buffer);
memset(receive_buffer, 0, 100);
}
if(FD_ISSET(fileno(stdin), &rset))
{
if(fgets(send_buffer, 100, stdin) == NULL)
return;
write(sockfd, send_buffer, strlen(send_buffer));
memset(send_buffer, 0, 100);
}
}
}
int main(int argc, char **argv)
{
int sockfd[5], i;
struct sockaddr_in server_sockaddr;
if(argc != 2)
{
fprintf(stderr, "Input error\n");
exit(EXIT_FAILURE);
}
for(i=0; i<5; i++)
{
if((sockfd[i] = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf(stderr, "Socket failed\n");
exit(EXIT_FAILURE);
}
bzero(&server_sockaddr, sizeof(server_sockaddr));
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(9877);
inet_pton(AF_INET, argv[1], &server_sockaddr.sin_addr);
if(connect(sockfd[i], (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)) == -1)
{
fprintf(stderr, "Connec failed\n");
}
}
str_cli(sockfd[0]);
exit(0);
}