#include "common.h"
int tcp_conn(int port_tcp)
{
int sockfd = -1;
struct sockaddr_in s_addr;
socklen_t len = addrsize;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
fprintf(stderr, "Tcp socket:%s\n", strerror(errno));
return -1;
}
bzero(&s_addr, addrsize);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(port_tcp);
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof(int));
if(bind(sockfd, (struct sockaddr *)&s_addr, len) == -1)
{
fprintf(stderr, "Tcp bind:%s\n", strerror(errno));
close(sockfd);
return -1;
}
if(listen(sockfd, backlog) == -1)
{
fprintf(stderr, "Tcp listen:%s\n", strerror(errno));
close(sockfd);
return -1;
}
return sockfd;
}
int udp_conn(int port_udp)
{
int sockfd = -1;
struct sockaddr_in s_addr;
socklen_t len = addrsize;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd == -1)
{
fprintf(stderr, "Udp socket:%s\n", strerror(errno));
return -1;
}
bzero(&s_addr, addrsize);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(port_udp);
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof(int));
if(bind(sockfd, (struct sockaddr *)&s_addr, len) == -1)
{
fprintf(stderr, "Udp bind:%s\n", strerror(errno));
close(sockfd);
return -1;
}
return sockfd;
}
int main(int argc, char **argv)
{
int tcp_sock, udp_sock;
int maxfd, maxfd_1;
fd_set readfds, readfds_1;
struct timeval tv, tv_1;
int ret = -1, ret_1 = -1;
socklen_t len = addrsize;
int rc, wc;
pid_t pt;
char buffer_r[BUFFERSIZE], buffer_w[BUFFERSIZE];
struct sockaddr_in c_addr;
int tcp_newfd;
if(argc != 3)
{
fprintf(stderr, "Usage: %s tcp_port udp_port\n", argv[0]);
exit(EXIT_FAILURE);
}
tcp_sock = tcp_conn(atoi(argv[1]));
udp_sock = udp_conn(atoi(argv[2]));
printf("Current process[%u] is waiting for a new connection tcp/udp\n", getpid());
while(Running)
{
maxfd = tcp_sock > udp_sock ? tcp_sock : udp_sock;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(tcp_sock, &readfds);
FD_SET(udp_sock, &readfds);
ret = select(maxfd + 1, &readfds, NULL, NULL, &tv);
if(ret == -1)
{
if(errno == EINTR)
continue;
Err_sys("Choose select tcp/udp")
}
else if(ret == 0)
continue;
else
{
/*tcp protocol connection and opertion*/
if(FD_ISSET(tcp_sock, &readfds))
{
printf("\n\nCreate a tcp connection\n");
tcp_newfd = accept(tcp_sock, (struct sockaddr *)&c_addr, &len);
if(tcp_newfd == -1)
{
if(errno == EINTR)
continue;
Err_sys("Tcp accept")
}
else
{
pt = fork();
if(pt == -1)
{
close(tcp_newfd);
close(tcp_sock);
Err_sys("Tcp fork")
}
else if(pt > 0) //parent process
close(tcp_newfd);
else if(pt == 0) //child process
{
close(tcp_sock);
printf("\n[TCP]Current creation child process id[%u]\n", getpid());
while(Running) //read/write operation
{
maxfd_1 = tcp_newfd;
tv_1.tv_sec = 1;
tv_1.tv_usec = 0;
FD_ZERO(&readfds_1);
FD_SET(0, &readfds_1);
FD_SET(tcp_newfd, &readfds_1);
ret_1 = select(maxfd_1 + 1, &readfds_1, NULL, NULL, &tv_1);
if(ret_1 == -1)
{
if(errno == EINTR)
continue;
else
{
close(tcp_newfd);
close(tcp_sock);
close(udp_sock);
Err_sys("Tcp server select")
}
}
else if(ret_1 == 0)
{
continue;
}
else if(ret_1 > 0)
{
if(FD_ISSET(tcp_newfd, &readfds_1))
{
/*Read section*/
memset(buffer_r, '\0', BUFFERSIZE);
rc = recv(tcp_newfd, buffer_r, BUFFERSIZE, 0);
if(rc <= 0)
{
if(rc < 0 && errno == EINTR)
continue;
if(rc == 0)
{
FD_CLR(tcp_newfd, &readfds);
close(tcp_newfd);
exit(EXIT_FAILURE);
}
Err_sys("Tcp server recv")
}
else
printf("[Tcp server recv]::%s\n", buffer_r);
}
if(FD_ISSET(0, &readfds_1))
{
/*Write section*/
memset(buffer_w, '\0', BUFFERSIZE);
printf("[Tcp server send]::");
fflush(stdout);
fgets(buffer_w, BUFFERSIZE, stdin);
buffer_w[strlen(buffer_w) - 1] = '\0';
wc = send(tcp_newfd, buffer_w, strlen(buffer_w), 0);
if(wc <= 0)
{
close(tcp_newfd);
Err_sys("Tcp server send")
}
}
}//else if(ret_1 > 0)
}//while
}//else if(pt == 0)
}//accept > 0
}//tcp protocol
/*udp protocol connection and opertion*/
if(FD_ISSET(udp_sock, &readfds))
{
printf("\n\n\nCreate a udp connection\n");
/*Read section*/
char buffer_r_1[BUFFERSIZE];
memset(buffer_r_1, '\0', BUFFERSIZE);
rc = recv(udp_sock, buffer_r_1, BUFFERSIZE, 0);
if(rc <= 0)
{
if(rc < 0 && errno == EINTR)
continue;
if(rc == 0)
{
close(udp_sock);
exit(EXIT_FAILURE);
}
Err_sys("Udp server recv")
}
else
printf("[Udp server recv]::%s\n", buffer_r_1);
}//udp protocol
}//select > 0
}//while 1
exit(EXIT_SUCCESS);
}