자바 와 C 간의 소켓통신... ( 내용 다시; )
내용이 애매한듯 해서 다시 질문드립니다;
그냥.. 기억이나 되살릴겸 간단히 테스트 프로그램을 짰는데... 원하는대로 동작하지 않는군요;;
만약 생각되러라면 c 코드로 된 서버에 자바로 만든 클라이언트가 메시지를 쏘면
C 서버는... read 를 통해서 읽은것을 화면에 보여주고 다음 패킷이 올때까지 read 에서 대기하는것입니다.
우선 c로만든 서버를 실행한뒤 자바 클라이언트 말고 telnet을 이용해서 telnet xxx.xxx.xxx.xxx 6331 로 접속하여
타이핑을 치거나 엔터를 치면 서버측에서는 받았다는 의미로 사이즈를 숫자로 표시해줍니다. 만약 타이핑을 하지 않으면
서버의 read 부분에서 대기하고 있죠.
하지만 자바 클라이언트로 접속하면 처음 한번 메시지를 보낸 뒤로도 아무것도 보내지 않아도 서버측에선 read에서
대기하지 못하고 계속 read size : 0 을 찍습니다. 텔넷으로 접속했을때는 그냥 기다리고 있는데(read 에서 블럭당하죠)
아래의 자바로 짠 클라이언트 프로그램으로 접속한경우는 계속 뭔가 들어오는것처럼 서버는 read에서 블럭당하지 못하고 계속 화면에 찍는군요.
간단한 실수나 착각한게 있는것 같은데 혼자만 생각하다보니 더 꼬이기만 꼬이는것 같고; 왜 read에서 블럭당하지 못하죠?
자바 클라이언트에서 뭔가 보낸다는 의미인데; 서버에서 받은 데이터의 사이즈는 0 이고...(사실 받은 데이터는 없으니..)
텔넷프로그램으로 해보면 원하는대로 동작하니 원;;
=============================================================================================================
#include <string.h> #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #define PORT 6331 #define BUFSIZE 32 unsigned char buf[BUFSIZE]; int readline(int , void *, int ); int main() { int server_sd,client_sd; int nbyte=0; unsigned long client_len; int i,j; i=0; struct sockaddr_in server_addr,client_addr; bzero(&server_addr,sizeof(server_addr)); bzero(&client_addr,sizeof(client_addr)); bzero(buf,BUFSIZE); memset((unsigned char*)&buf,0x00,BUFSIZE ); /* 소켓생성 */ if ( (server_sd=socket(AF_INET,SOCK_STREAM,0)) < 0 ) { perror("Socket create error : "); return -1; } /* 소켓 초기화 * if( (init_sock(server_sd,SO_REUSEPORT))==-1) { perror("init_sock error"); return -1; } else fprintf(stderr,"소켓 초기화 완료\n"); */ server_addr.sin_family=AF_INET; server_addr.sin_port=htons(PORT); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); fprintf(stderr,"using PORT / [%d]\n",PORT); if( bind(server_sd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0) { perror("socket bind error "); close(server_sd); return -1; } listen(server_sd,1); client_len=sizeof(client_addr); fprintf(stderr,"대기중...\n"); if( (client_sd=accept(server_sd,(struct sockaddr *)&client_addr,&client_len)) < 0) { perror("Accept Error "); return -1; } else printf("client connect...\n"); fprintf(stderr,"client_sd : %d\n",client_sd); while(1) { nbyte=read(client_sd,buf,BUFSIZE); fprintf(stderr,"[%d] read size : %d\n",i++,nbyte); sleep(1); } close(client_sd); close(server_sd); return 0; }
----------------------------------------------------------------------------------------------------
import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class SocketTest { public static void main(String args[]) throws IOException { Socket socket; socket = new Socket("211.54.12.239",6331); OutputStream os; os = socket.getOutputStream(); byte[] b = new byte[2]; b[0]=(byte)0x10; os.write(b); socket.close(); } }
자바 클라이언트
자바 클라이언트 부분에서 os.write(b); 다음에 os.flush(); 해보셨나요?
예...
혹시나 해서 해봤었는데.. 다시 해봐도 역시 결과는.. 서버에서 read 블럭 되지 않고 계속 데이터를 0 만큼 받았다고 찍는군요;
자바쪽에서 연결을 끊어서 그렇습니다.
연결을 끊지 않으면 텔넷으로 테스트한 것과 동일한 상태가 됩니다.
물론 연결이 끊기지 않게 하려면 자바쪽에서 VM이 종료되지 않게 해야겠지요.
socket.close()도 호출하면 안되구요.
-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.
클라이언트에서 close 를...
아.. 자바 클라이언트에서 close 를 하지 않으면 텔넷과 동일한 상태가 되는건가요?
정말 보니... close를 할 이유가 없긴하군요; 해서 자바쪽에서 close를 주석 처리해도..
결과는 .. 저는 같게 나오는데 혹시 dormael 님은 주석처리 해서 테스트 해보니
c 서버 쪽에서 read 에서 블럭 당하고 가만기 기다려주나요?? 전.. 그냥 계속 넘어가는데;; ~_~;;
아니면 다른 의미;;?
vm이 종료되어 소켓도 자동으로 닫힙니다.
main함수 호출이 종료되어 소켓도 자동으로 닫혀서 그렇습니다.
함수 맨 마지막에 무한루프 돌게 하시면 우선 종료는 안될꺼구요.
예를들어,
이런식으로 하시면 됩니다.
물론 일반적인 소켓프로그램의 구조를 이렇게 작성하지는 않을겁니다.
telnet으로 접속한 것과 비슷한 효과를 얻으려면 무한루프 돌면서 표준입력(System.in)에서 읽은 내용을 서버로 보내게 해야 겠지요.
-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.
아.. vm;;;
그생각은 전혀 못했습니다 ㅠ_ㅜ/ vm의 종료라;;;
System.in 은... 사실 귀찮아서 안했고 그냥 쏘고 받는지 확인만 할려고 했던건데... 하하;
감사합니다 ^^;
댓글 달기