2013-08-24 2 views
1

올바른 클라이언트가 서버에서 승인 한 동일한 연결을 사용하여 데이터를 보내나요?.소켓 클라이언트는 서버가 허용 한 연결을 사용하여 전송합니다.

상황은 다음과 같습니다. 내 PC에서 파란 이빨 서버가 실행 중이고 반대편에 클라이언트와 서버가있는 안드로이드 전화가 있습니다. 안드로이드 측면에서 클라이언트가 연결을 시작합니다. 안드로이드 샘플에서 블루투스 채팅 예제를 사용하고 있습니다.

그리고

 BluetoothSocket socket; 
    InputStream tmpIn = null; 
    OutputStream tmpOut = null; 

    // Get the BluetoothSocket input and output streams 

     tmpIn = socket.getInputStream(); 
     tmpOut = socket.getOutputStream(); 

같은 내가 서버와 클라이언트를 구현하는 Bluez 라이브러리를 사용하고있는 PC의 측면에서 안드로이드 모양에 서버 - 클라이언트.
서버가 블루투스 수신 스레드와 메인 스레드를 포함합니다. 서버가 안드로이드 전화에서 연결을 수락 할 때마다 소켓 값을 전역 변수에 할당하고 클라이언트가 동일한 소켓을 사용하여 데이터를 보내야 할 때마다

서버 : -

int GLOBAL_CLIENT; 
void* recive_bluetooth_trd(void*) 
{ 
............................... 
.............................. 
client = accept(s, (struct sockaddr *)&rem_addr, &opt); 
GLOBAL_CLIENT=client; 

while(1){ 
    bytes_read = read(client, buf, sizeof(buf)); 
.................... 
................... 
} 

클라이언트 : -

void clinet(char *msg, int length){ 
........................ 

int bytes_write=write(GLOBAL_CLIENT,message, length); 

.......................... 
} 

내 할건가 estion은 올바른 방법인가요? 문제는 클라이언트가 PC에서 데이터를 성공적으로 보내고 안드로이드 측에서는 수신하지 않는 경우가 있다는 것입니다.

buf[bytes_read] = '\0'; 

답변

0

내가 보는 가장 큰 문제는 여러분들이 떠나지 않을 것입니다 : 당신이 문자열로 처리하는 경우 버퍼를 종료

+0

귀중한 정보를 보내 주셔서 감사합니다. 여기 내 전체 코드 http://pastebin.com/embed_js.php?i=fa2Xv9Y1 – Haris

+0

@ 하리스 예, 연결 해제를 처리하지 않습니다. 당신의 프로그램을 매우 슬프게 만들 수있다. 만약 당신이 0이된다면, 당신은'break'를해야한다. – xaxxon

+0

아니,'<= 0'이라면 깨야한다. –

0

나에게 올바른 보이지만 read 후에는 NUL ('\0')에 있습니다 while(1)은 클라이언트가 연결을 끊어도 루프됩니다. 0 바이트 읽기 (리턴 코드 < = 0)로 즉시 읽기가 영원히 반환되어 소켓 연결이 해제되었다는 신호를 보냅니다. 코드가 무한 루프로 들어가서 단일 스레드를 사용할 수있는 모든 CPU 리소스를 사용합니다.

소켓 및 IO 반환 코드를 항상 확인하고 오류를 올바르게 처리해야합니다. 소켓에 대한 에러 처리는 보통 실제 소켓 코드의 약 3 배입니다.

당연히 .......... 물건이 중요한 비트가 아니라면. 사람들이 묻는 질문과 관련된 코드를 숨기면 언제나 알기가 쉽지 않습니다.

+1

답장을 보내 주셔서 감사합니다 ... – Haris

+0

그래서 같은 시간에 읽고 쓰는 것이 어떤 문제입니까? – Haris

+0

일부 데이터가 도착할 때까지'read'가 (sleep) 블록 할 것입니다. –