게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
fork를 사용한 udp chat에 대한 질문입니다.
게시물ID : programmer_9804짧은주소 복사하기
작성자 : 아버지레드불
추천 : 0
조회수 : 545회
댓글수 : 5개
등록시간 : 2015/05/08 20:43:04
옵션
  • 본인삭제금지
수업시간에 배운 걸 이용해서 udp로 서버와 클라가 chat하는 걸 만들려고 한번 짜보았습니다.

/* Sample UDP server */

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char**argv)
{
   int sockfd,n;
   struct sockaddr_in servaddr,cliaddr;
   socklen_t len;
   char sendline[1000];
   char recvline[1000];

   pid_t pid;

   sockfd=socket(AF_INET,SOCK_DGRAM,0);

   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servaddr.sin_port=htons(32000);
   bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  
   pid = fork();

   if(pid == -1){
      printf("can't fork(), it's error!\n");
      exit(0);
   }

   len = sizeof(cliaddr);

   if(pid == 0){
      for(;;){ // Receive Message
         n = recvfrom(sockfd,recvline,1000,0,(struct sockaddr *)&cliaddr,&len);
         recvline[n] = 0;
         printf("Received the following:\n");
         printf("%s",recvline);
         printf("-------------------------------------------------------\n");
      }
   }
   else{ // Send Message
      while (fgets(sendline, 10000,stdin) != NULL){
         sendto(sockfd,sendline,strlen(sendline),0,
                (struct sockaddr *)&cliaddr,sizeof(cliaddr));
         printf("-------------------------------------------------------\n");
      }
   }

   return 0;
}

일단 서버가 이러합니다.

/* Sample UDP client */

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char**argv)
{
   int sockfd,n;
   socklen_t len;
   struct sockaddr_in servaddr,cliaddr;
   char sendline[1000];
   char recvline[1000];
   pid_t pid;

   if (argc != 2)
   {
      printf("usage:  udpcli <IP address>\n");
      exit(1);
   }

   sockfd=socket(AF_INET,SOCK_DGRAM,0);

   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=inet_addr(argv[1]);
   servaddr.sin_port=htons(32000);

   pid = fork();

   if(pid == -1){
      printf("can't fork(), it's error!\n");
      exit(0);
   }

   len = sizeof(servaddr);

   if(pid == 0){ // Receive Message
      for(;;){
         n = recvfrom(sockfd,recvline,1000,0,(struct sockaddr *)&servaddr,&len);
         recvline[n] = 0;
         printf("Received the following:\n");
         printf("%s",recvline);
         printf("-------------------------------------------------------\n");
      }      
   }
   else{ // Send message
      while (fgets(sendline, 10000,stdin) != NULL){
         sendto(sockfd,sendline,strlen(sendline),0,
                (struct sockaddr *)&servaddr,sizeof(servaddr));
         printf("-------------------------------------------------------\n");
      }
   }

   return 0;
}

클라는 이러 합니다.

fork를 이용해서 한번 해봤습니다. 사실 thread로 하는 것이 낫지만..

일단 이 코드로 실행 해봤을때,

클라쪽에서 서버로 메세지 전송을 잘됩니다.

그런데 서버 측에서 클라 쪽으로 전송이 이루어 지지 않더군요.

제가 생각하기론 될거라 생각했는데,

어디쪽이 잘 못 된걸까요?
출처 제가 직접 짜본 코드
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호