<server.c>
#include <stdio.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#define SERV_PORT 62000
#define RECV_BUF_LEN 80
void sig_alrm(int signo);
void sig_alrm(int signo)
{
printf("alarm...\n");
}
void sig_child(int signo)
{
printf("Client terminated \n");
}
int main(int argc, char *argv[])
{
int sfd, cfd;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int size, len;
char recv_buf[RECV_BUF_LEN];
pid_t pid;
sfd = socket(AF_INET, SOCK_STREAM, 0);
len = sizeof(saddr);
bzero((char*)&saddr, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = htons(SERV_PORT);
if ( bind(sfd, (struct sockaddr*)&saddr, sizeof(saddr)) < 0 ) {
printf("Bind Error\n");
return -1;
}
listen(sfd, 5);
signal(SIGALRM, sig_alrm);
signal(SIGCHLD, sig_child);
//signal(SIGINT, SIG_IGN); //ignore
size = sizeof(caddr);
while (1)
{
cfd = accept(sfd, (struct sockaddr*)&caddr, &size);//connect
printf("Client : %d\n", cfd);
pid = fork(); // call pre-fork() function
if(pid <0)
{
printf("Fork Error!!\n");
exit(-1);
}
else if(pid==0) //child process
{
// alarm(3);
while(len = read(cfd, recv_buf, RECV_BUF_LEN))
{
recv_buf[len] = '\0';
printf("recv : %s", recv_buf);
if(strncmp(recv_buf, "exit",4) == 0)//client request termination.
{
// close(cfd);
// close(sfd);
// return 0;
exit(1);
} // alarm(0);
else//parent process
{
}
}
}
}
close(cfd);
close(sfd);
return 0;
}
<client.c>
#include <stdio.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define SERV_PORT 62000
#define RECV_BUF_LEN 1024
#define MSG_SIZE 1024
int main(int argc, char *argv[])
{
int sfd;
struct sockaddr_in saddr;
int len, msglen;
static char msg[MSG_SIZE];
sfd = socket(AF_INET, SOCK_STREAM, 0);
bzero((char*)&saddr, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr(argv[1]);
saddr.sin_port = htons(SERV_PORT);
if (connect(sfd, (struct sockaddr*)&saddr, sizeof(saddr)) < 0) {
printf("connect error\n");
return -1;
}
while (1)
{
msglen = read(STDIN_FILENO, msg, MSG_SIZE);
if (len = write(sfd, msg, msglen) < msglen)
{
printf("write error\n");
}
if (strncmp(msg, "exit", 4) == 0)
{
close(sfd);
return 0;
}
}
// close(sfd);
return 0;
}
'Education > Networking' 카테고리의 다른 글
UDP (0) | 2009.08.27 |
---|