드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
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로 하는 것이 낫지만..
일단 이 코드로 실행 해봤을때,
클라쪽에서 서버로 메세지 전송을 잘됩니다.
그런데 서버 측에서 클라 쪽으로 전송이 이루어 지지 않더군요.
제가 생각하기론 될거라 생각했는데,
어디쪽이 잘 못 된걸까요?
댓글 분란 또는 분쟁 때문에
전체 댓글이 블라인드 처리되었습니다.
새로운 댓글이 없습니다.