자바 와 C 간의 소켓통신... ( 내용 다시; )

xt의 이미지

내용이 애매한듯 해서 다시 질문드립니다;

그냥.. 기억이나 되살릴겸 간단히 테스트 프로그램을 짰는데... 원하는대로 동작하지 않는군요;;

만약 생각되러라면 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();	
	}
}
seoleda의 이미지

자바 클라이언트 부분에서 os.write(b); 다음에 os.flush(); 해보셨나요?

xt의 이미지

혹시나 해서 해봤었는데.. 다시 해봐도 역시 결과는.. 서버에서 read 블럭 되지 않고 계속 데이터를 0 만큼 받았다고 찍는군요;

dormael의 이미지

연결을 끊지 않으면 텔넷으로 테스트한 것과 동일한 상태가 됩니다.

물론 연결이 끊기지 않게 하려면 자바쪽에서 VM이 종료되지 않게 해야겠지요.
socket.close()도 호출하면 안되구요.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

xt의 이미지

아.. 자바 클라이언트에서 close 를 하지 않으면 텔넷과 동일한 상태가 되는건가요?
정말 보니... close를 할 이유가 없긴하군요; 해서 자바쪽에서 close를 주석 처리해도..
결과는 .. 저는 같게 나오는데 혹시 dormael 님은 주석처리 해서 테스트 해보니
c 서버 쪽에서 read 에서 블럭 당하고 가만기 기다려주나요?? 전.. 그냥 계속 넘어가는데;; ~_~;;

아니면 다른 의미;;?

dormael의 이미지

main함수 호출이 종료되어 소켓도 자동으로 닫혀서 그렇습니다.
함수 맨 마지막에 무한루프 돌게 하시면 우선 종료는 안될꺼구요.

예를들어,

while(ture) {
  try { Thread.sleep(1000) } catch(InterruptedException ie) {}
}

이런식으로 하시면 됩니다.

물론 일반적인 소켓프로그램의 구조를 이렇게 작성하지는 않을겁니다.
telnet으로 접속한 것과 비슷한 효과를 얻으려면 무한루프 돌면서 표준입력(System.in)에서 읽은 내용을 서버로 보내게 해야 겠지요.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

xt의 이미지

그생각은 전혀 못했습니다 ㅠ_ㅜ/ vm의 종료라;;;

System.in 은... 사실 귀찮아서 안했고 그냥 쏘고 받는지 확인만 할려고 했던건데... 하하;

감사합니다 ^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.