Server.c
more..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
char *EXIT_STRING = "exit"; // 종료문자
int recv_and_print(int sd); // 상대로부터 메시지 수신후 화면출력
int input_and_send(int sd); // 키보드입력받고 상대에게 메시지전달
int sendtime(int sd);
#define MAXLINE 511
int main(int argc, char *argv[]) {
struct sockaddr_in cliaddr, servaddr;
int listen_sock, accp_sock, // 소켓번호
addrlen = sizeof(cliaddr);
pid_t pid;
if (argc != 2) {
printf("사용법: %s port\n", argv[0]);
exit(0);
}
// 소켓 생성
if((listen_sock=socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket fail");
exit(0);
}
// 서버의 소켓주소 구조체 servaddr을 '0'으로 초기화
bzero((char *)&servaddr, sizeof(servaddr));
// servaddr을 세팅
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(atoi(argv[1]));
// bind() 호출
if(bind(listen_sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind fail");
exit(0);
}
puts("서버가 클라이언트를 기다리고 있습니다");
listen(listen_sock, 1);
// 클라이언트 연결요청 수락
if((accp_sock = accept(listen_sock,(struct sockaddr *)&cliaddr, &addrlen)) < 0) {
perror("accept fail");
exit(0);
}
puts("클라이언트가 연결되었습니다.");
if( (pid = fork()) > 0) {
if((pid=fork())>0){
input_and_send(accp_sock); // 키보드입력받고 상대에게 메시지전달
}else if(pid==0){
sendtime(accp_sock);
}else{
perror("fork 에러");
close(listen_sock);
close(accp_sock);
}
}else if (pid == 0){
recv_and_print(accp_sock); // 상대로부터 메시지 수신후 화면출력
}
close(listen_sock);
close(accp_sock);
return 0;
}
// 키보드입력받고 상대에게 메시지전달
int input_and_send(int sd) {
char buf[MAXLINE+1];
int nbyte;
while(fgets(buf, sizeof(buf), stdin) != NULL) {
nbyte = strlen(buf);
write(sd, buf, strlen(buf));
// 종료문자열 입력 처리
if (strstr(buf, EXIT_STRING) != NULL ) {
puts("Good bye.");
close(sd);
exit(0);
}
}
return 0;
}
// 상대로부터 메시지 수신후 화면출력
int recv_and_print(int sd) {
char buf[MAXLINE+1];
int nbyte;
while(1) {
if( (nbyte=read(sd, buf, MAXLINE))<0){
perror("read fail");
close(sd);
exit(0);
}
buf[nbyte] = 0;
// 종료문자열 수신시 종료
if (strstr(buf, EXIT_STRING) != NULL )
break;
printf("%s", buf); // 화면 출력
}
return 0;
}
int sendtime(int sd)
{
char *buf;
time_t tim;
while(1){
sleep(10);
tim=time(NULL);
buf=ctime(&tim);
write(sd, buf, strlen(buf));
}
return 0;
}
Client.c
more..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 511
char *EXIT_STRING = "exit"; // 종료문자 정의
int recv_and_print(int sd); // 상대로부터 메시지 수신후 화면출력
int input_and_send(int sd); // 키보드입력받고 상대에게 메시지전달
int main(int argc, char *argv[]) {
pid_t pid;
static int s;
static struct sockaddr_in servaddr;
// 명령문 입력 인자 처리
if (argc != 3) {
printf("사용법: %s server_ip port \n", argv[0]);
exit(0);
}
// 소켓 생성
if((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
printf("Client: Can't open stream socket.\n");
exit(0);
}
// servaddr을 '0'으로 초기화
bzero((char *)&servaddr, sizeof(servaddr));
// servaddr 세팅
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
servaddr.sin_port = htons(atoi(argv[2]));
// 서버에 연결요청
if(connect(s,(struct sockaddr *)&servaddr,sizeof(servaddr)) <
0) {
printf("Client: can't connect to server.\n");
exit(0);
}
if( (pid=fork())>0) // 부모 프로세스
input_and_send(s);
else if(pid==0) // 자식 프로세스
recv_and_print(s);
close(s);
return 0;
}
// 키보드입력받고 상대에게 메시지전달
int input_and_send(int sd) {
char buf[MAXLINE+1];
int nbyte;
while(fgets(buf, sizeof(buf), stdin) != NULL) {
nbyte = strlen(buf);
write(sd, buf, strlen(buf));
// 종료문자열 입력 처리
if (strstr(buf, EXIT_STRING) != NULL ) {
puts("Good bye.");
close(sd);
exit(0);
}
}
return 0;
}
// 상대로부터 메시지 수신후 화면출력
int recv_and_print(int sd) {
char buf[MAXLINE+1];
int nbyte;
while(1) {
if( (nbyte=read(sd, buf, MAXLINE))<0) {
perror("read fail");
close(sd);
exit(0);
}
buf[nbyte] = 0;
// 종료문자열 수신시 종료
if (strstr(buf, EXIT_STRING) != NULL )
break;
printf("%s", buf); // 화면 출력
}
return 0;
}
댓글 없음:
댓글 쓰기