게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
리눅스에서 간단히 채팅프로그램을 만들었는데 질문이 있습니다
게시물ID : programmer_5771짧은주소 복사하기
작성자 : 치킨고프다
추천 : 0
조회수 : 921회
댓글수 : 2개
등록시간 : 2014/10/04 20:42:31
옵션
  • 베스트금지
  • 본인삭제금지
프로그램은 서버에 클라이언트가 접속을 해서 서버와 클라가 번갈아가면서 메세지를 보내는 프로그램인데요

문제점이 만약 클라가 메세지를 쓰고 있다가 서버가 메세지를 보내버리면 클라가 쓰고 있던 메세지는 무시가 되고 서버가 보낸 메세지가 출력이 됩니다 

이건 문제가 아닌데 그러고서 클라가 메세지를 보낼 때 전에 쓰던 메세지도 같이 덧붙여져서 보내집니다 

예를 들어서 클라가 123쓰다가 서버가 aaa라고 왔으면 

123From server : aaa 이렇게 되는데요 

문제가 클라가 다시 456 써서 서버에 보내면 서버쪽에 123456을 수신하게 됩니다

주고 받는 부분 코드만 올리겠습니다 복붙이 안돼서 ㅎ

클라

for(;;) {
printf("\nsendmessage \t=> ");
fflush(stdin);
fgets(buf, MAXLINE, stdin); //buf가 보낼 메세지를 담을 변수입니다 MAXLINE은 4096입니다

if( write(sockfd, buf, strlen(buf)) <0) //buf를 보냅니다
err_sys("write error");
if(!strncmp(buf, "quit", 4)) //quit를 입력했으면 빠져나갑니다
break;

if( (n=read(sockfd, recvline, MAXLINE)) <0) //서버에서 온 메세지를 recvline에 담습니다
err_sys("read error");
else if(n==0)
fputs("connection closed", stdout);

recvline[n]=0;
printf("\nFrom %s \t=> ", argv[1]); // argv[1]은 서버 아이피입니다
fputs(recvline, stdout); //recvline을 출력합니다
}


서버

for(;;) {
if( (n=read(connfd, buf, MAXLINE))<0 ) // 클라로부터 메세지를 받아 buf에 저장합니다
err_sys("read error");
else if(n==0)
break;
buf[n]=0;
if( !strncmp(buf, "quit", 4)) //buf가 quit면 종료시킵니다
exit(0);
printf("\nFrom %s \t=> ", clntname); //clntname은 클라 아이피입니다
fputs(buf, stdout);

printf("\nsendmessage \t=> ");
fflush(stdin);
fgets(sendm, MAXLINE, stdin); // sendm은 보낼 메세지를 담을 변수입니다

if(write(connfd, sendm, strlen(sendm)) <0) //보냅니다
err_sys("write error");
}


필요하시다면 코드 모두 적어드리겠습니다

꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호