Java(서버) 와 C(클라이언트) 간에 통신하는 소켓프로그래밍문제인데요..
글쓴이: mmx822 / 작성시간: 금, 2012/03/30 - 10:53오후
안녕하세요..
과제를 하는데.. 잘안되서 이렇게 포럼을 작성합니다..
일단 과제의 목표는.. java로 작성된 서버와 c로 작성된 클라이언트 간에 소켓프로그래밍을 통해서 통신하는 것인데요..
실은 아주 간단한 것입니다..
클라이언트에서 소문자를 입력해서 서버로 보내면... 자바로 작성된 서버에서는 그걸 대문자로 바꾸고 클라이언트로 넘겨주게되고..
클라이언트는 그걸 프린트하는 형식인데요..
이상하게 아래의 코드로는 메세지가 제대로 전달되질 않습니다..;
제가 자바는 아주 많이 초보라서.. 어디를 바꿔야하는지도 모르겠어서 이렇게 포럼을 작성합니다..
아래는 코드입니다..
이건 자바로 작성된 서버 import java.io.*; import java.net.*; class TCP_Server_Java { public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(1234); while(true) { Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\n'; outToClient.writeBytes(capitalizedSentence); } } } 이건 C로 작성된 클라이언트 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { WSADATA wsaData; SOCKET hSocket; char message[BUF_SIZE]; char modifiedmessage[BUF_SIZE]; int strLen; SOCKADDR_IN servAdr; if(argc!=3) { printf("Usage : %s <IP> <port>\n", argv[0]); exit(1); } WSAStartup(MAKEWORD(2, 2), &wsaData); hSocket=socket(PF_INET, SOCK_STREAM, 0); memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family=AF_INET; servAdr.sin_addr.s_addr=inet_addr(argv[1]); servAdr.sin_port=htons(atoi(argv[2])); connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr)); scanf("%s",message); send(hSocket, message, strlen(message), 0); strLen=recv(hSocket, modifiedmessage, strlen(modifiedmessage), 0); modifiedmessage[strLen]='\0'; printf("Message from server: %s", modifiedmessage); closesocket(hSocket); WSACleanup(); return 0; }
어디가 잘못된 것인지.. 정확히 그걸 왜 그렇게 바꿔야 정상 작동하는지 알려주세요~
Forums:
Java는 잘 모르겠지만 Java 수신 코드를
Java는 잘 모르겠지만 Java 수신 코드를 보면
아마 method 이름을 보니 CR(혹은 LF)가 들어 올 때까지 기다리고 있는 듯 하군요.
그런데 송신 코드를 보면
여기에서는 CRLF가 송신이 되지 않습니다. 송신측에서 CRLF를 붙여서 보내어 보세요.
www.gilgil.net
여전히 안되네요..ㅜ
케리지리턴과 뉴라인을 붙여도 여전히 서버에서 한글자만 답해줍니다..
즉.. 클라이언트에서 abcd 를 보내면 서버에서는 클라이언트에게 A 만을 보내고 끝을내는군요..ㅜㅜ
아..정말 지금 답답해 죽겠네요.. 이게 왜 이렇게 안 되는건지.. 제가 자바만 똑바로 알아도 이런사태는 없을거같은데..
당췌 자바의 BufferedReader 가 정확히 어떤식으로 쓰이는건지도 모르겠으니..쩝..
다른 방법은 없을런지요??
gilgil.net
1 Byte ASCII code와 n Byte UNI code와 같이 코드 체계가 달라서 그런 거 아닐까요?
Wireshark 등으로 패킷을 잡아서 디버깅해 보시기 바랍니다.
www.gilgil.net
C(서버) 와 Java(클라이언트)도 있는데 이건 잘 돌아갑니다..
C(서버) 와 Java(클라이언트)도 있는데 이건 잘 돌아갑니다..
그 얘기는 코드 체계의 문제는 아닌거같은데.. 혹시 저 위의 코딩에서 스트링의 첫번째 글자빼고 쏵 날아가버릴만한 곳을 찾을 수 있으실까요? ㅜㅜ
혹시 모르니..C(서버) Java(클라이언트) 코딩도 올려보겠습니다..
참고하세요.
제가 생각하기엔
"strLen=recv(hSocket, modifiedmessage, strlen(modifiedmessage), 0);"
==> 여기서 strlen(modifiedmessage) 이 잘못된듯합니다. 문자열 받기전에 문자열 크기를 구하네요.
출처 : http://forum.falinux.com/zbxe/?document_srl=441107
--------- 인용 -----------
recv() 함수는 소켓으로부터 데이터를 수신합니다.
헤더 #include
#include
형태 int recv(int s, void *buf, size_t len, int flags);
인수
int s : 소켓 디스크립터
void *buf : 수신할 버퍼 포인터 데이터
size_t len : 버퍼의 바이트 단위 크기
int flags : 아래와 같은 옵션을 사용할 수 있습니다.
flags 옵션 설명
MSG_DONTWAIT 수신을 위해 대기가 필요하다면 기다리지 않고 -1을 반환하면서 바로 복귀
MSG_NOSIGNAL 상대방과 연결이 끊겼을 때, SIGPIPE 시그널을 받지 않도록 합니다.
반환
-1 이외 : 실제 수신한 바이트 수
-1 : 실패
그래서 그 부분을 BUF_SIZE-1 로 변경했지만..안되요..;
그래서 그걸 BUF_SIZE-1 로했지만.. 여전히 한글자만 대문자로 바뀌고 한글자만 출력된 뒤 종료되네요..
아..오늘 자정까지 내야되는데 어떡하죠 ㅜㅜ
댓글 달기