2016-09-11 3 views
1

)C++ 서버 및 자바 클라이언트 채팅

저는 C++ 서버 및 Java 클라이언트로 채팅 프로그램을 작성합니다.

이다 클라이언트로부터 메시지를 수신 한 책임이있는 함수의 코드 :

void *recieve(void* *v) 
{ 
    while (true) 
    { 
     bzero(buffer, 256); 
     n = read(socketfd, buffer, 256); 
     if (n < 0) 
      exit(1); 
     printf("Client: %s", buffer); 
    } 
} 

서버에 메시지를 보낼 타르 책임이있는 함수의 코드는 다음과 같습니다

ps.println(msg); 

곳 ps는 인쇄 스트림입니다.

서버로 메시지를 보내면 "hello world"라고 말하면 C++ 서버가 다음을 인쇄합니다. "Client : hello worldClient".

누군가 나를 도와 주시면 감사하겠습니다. (내 영어가 좋지 않다면 사과드립니다.) 감사합니다!

+0

읽은 바이트 수만 쓰고 쓰려고 했습니까? 그리고 Joachim이 말했듯이, 널 종료 바이트 x를 잊지 말아야합니다. x) – Naliwe

+0

그런데'read' 호출에 대한 에러 검사에서 중요한 경우를 놓칩니다. 제대로 연결 해제를 처리하지 못합니다. –

+0

@JoachimPileborg는 256 바이트 미만인 경우 null 종결 자 (null terminator)가 있는지 확인합니다 (http://man7.org/linux/man-pages/man3/bzero.3.html) [bzero()]] 받은? – Christophe

답변

2

read() 함수는 파일의 끝에 도달하면 0을 반환합니다. 빈 문자열로 표시됩니다

그래서 귀하의 경우, "Hello world"를 수신하는 제 1 루프 반복이 다음 그래서 "클라이언트가" read() 반환 0을 제외한 아무것도받을 수 없습니다 한 번 더 반복,있다.

  • 소켓 기반 통신으로,이 서버 측에서 하나 read()는 클라이언트 측에서 하나 println()에 해당하는 것을 보장 할 수 없습니다 :

    또한,주의하십시오. 따라서 더 긴 메시지의 경우, 메시지를 조각으로받을 위험이 있습니다. 그러면 출력에서 ​​메시지 텍스트 내에 여러 개의 "클라이언트"가 표시됩니다.

  • 행 구분 기호가 on the java side 일 경우 서버 측에서 예상되는 line separator과 일치하지 않을 수도 있습니다. 교차 플랫폼으로 작업하는 경우 기대하십시오.