이거좀 보시고 답변좀 부탁드립니다.
메신저 구현하는데요... 양자간 대화가 잘 안되서 그러는데..
메신저 서버, 디비서버는 잘 돌아가고 있고요...
메신저 서버에 로긴하면 상대방의 메세지를 리슨하고 억셉트하는
스레드가 실행됩니다....
상대방의 메세지를 받으면 창이 뜨면서 메시지가 그창에 출력되는데...
새로 열린 창에 답글을 입력하면... 상대방에게 그 답글이 전해지지가
않아서... 짐 골치를 썩이고 있는데... 함 보시고 답변좀 부탁드립니다.
gtk_main()이 실행되고... 로긴창 열리공 로긴 성공하면... 회원목록창이
열리면서 디비에서 목록을 받어와서 목록으로 트리를 구성합니다.
해당 회원을 액티브 시키면 창이 열리고 메세지를 입력하면 상대방의
메신저에도 창이 열리면서 메세지가 잘 전달되고요... 여기까진 문제없눈데
답글 보내는.....시점에서....... 일단 소스부터 보면....
int sock; // 전역변수 // 메세지 기둘리는 스레드.... recv_from_friend(int *arg) { sock= *arg; // 억셉트까지 잘 된 디스크립터를 받아서 sock한테 넘김다. for( ; ; ) { n=read(sock,buff,1000); // 여기 두줄은 중요치 않음... 텍스트뷰에 메세지를 올려놓는 코드... buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview); gtk_text_buffer_insert(buffer,&iter,buffer,-1); fputs(buffer,stdout); } } // 요기는 상대방에 의해서 열린창에서 메세지 보내는부분.. on_entry9_activate() { // 입력칸에 쓰여진 문자열 포인터를 txt에게 반환...(머 중요치 않음) txt=gtk_editable_get_chars(GTK_EDITABLE(entry),0,-1); write(sock, txt, strlen(txt)); // sock를 여기서 갖다 쓰기가 불편해서..결국 전역변수로 선언 했심다.. // 억셉트한 디스크립터로 메세지 받공 이넘을 다시 이용해서 상대방에게 // 메세지를 전송하려는 코드...;; 아무래도 여가 문제인듯한디;; }
내가 상대방에게 보낼때..회원 선택하면 커넥트가 이뤄지는 부분..은
잘 보내지기에 따로 코드남기지 않습니다....
위와 같이 하면 당연히 잘 보내질거라 생각했눈데... 잘 안되네요...;;;
위 포트는 1111을 쓰고있고요 메세지는 잘 받는데...
받은후에 보내는부분이 잘 안되네요... getpeername을 써서 아이피와
포트를 출력해보니... 다른회원에게 보낼때는 포트가 1111로 잘 보내지는데
메세지 받은후에 받은 디스크립터를 이용해 답글을 쓸때는 37562라는
엉뚱한 포트가 나오더군요;;;;; 매번 답글을 쓰거나 메세지 보낼때마다
커넥트를 할수도 없눈 노릇이공... 양자간에 메세지를 잘 교환하려면
위 코드를 어케 바꿔야 할까요?.........
내가 메세지를 보내던... 답글을 보내던 위 on_entry9_activate에서
이루어져야 합니다.......;;
코드를 많이 생략했는데... 대충 중요한것만 써놓았습니다.
문제점 해결해 주시면 정말 감사하겠습니다.
정상적으로 보내진 것입니다. 포트는 서버만을 정하는 것이지 클라이언트가
정상적으로 보내진 것입니다. 포트는 서버만을 정하는 것이지 클라이언트가 따로 자신의 포트를 정하지 않습니다. 그래서 정해진 포트로 여러명의 클라이언트가 접속할 수 있는 것입니다. 받는 부분에서 받지를 못하는 것 같습니다. 소켓이 두 개 있어야 할 것으로 보입니다.
댓글 달기