2012-03-06 2 views
0

클라이언트 및 서버 응용 프로그램을 만들었습니다. 서버에서 데이터를 전송할 때 데이터가 수신 될 때 서버가 블럭 상태 (데이터 전송이 클라이언트에서 완료되었을 때 여전히 recv 데이터까지 대기)가되면 소켓 양식을 종료해야합니다. 데이터를 전송합니다. 나는 싫어.C에서 클라이언트를 여러 번 (클라이언트가 한 번 이상) 수신/송신하는 서버를 만듭니다.

내 데이터 전송이 완료되었음을 서버에 알려주는 방법을 알려주십시오.

CLIENT :

내 서버는 다음과 같은 동작 안녕하세요 // 지금 종료에 강제 소켓 달리 서버 블록 상태로 서버를 간다 : 소켓이기 때문에 안녕하세요 //이 아무것도 후 가 전송 될 수있다

CLIENT를 : 나는 다음과 같이 원하는

폐쇄 012 인사 서버 : 안녕
고객 : 안녕하세요?
서버 : 감사합니다.
SERVER : 당신은 어떠합니까?
고객 : 나도 좋습니다. 감사합니다.

+3

라인 # 42에서 fork() 호출을 제거하십시오. – wildplasser

+0

어떤 프로토콜은 UDP, TCP, SCTP를 사용합니까? – snibu

+0

TCP 프로토콜 ....... –

답변

0

, 당신은 당신의 자신의 프로토콜을 개발해야합니다. 이 프로토콜은 클라이언트/서버 간의 통신을 정의합니다. 예를 들어 문자열 만 사용하는 경우 데이터 크기, 데이터 또는 일부 형식의 데이터 구분 기호를 포함 할 수 있습니다.

0

(윈도우에서) ioctlsocket 기능을 들여다 보거나 (리눅스에서)를 fcntl 기능은, 특히, 비 - 블로킹으로 소켓을 설정합니다.

fcntl(sock_fd, F_SETFL, O_NONBLOCK); 

또는, 첫 번째가 읽기를 차단하는 동안 소켓에 쓰는 별도의 스레드가 있어야합니다. 여기

일부 더 많은 정보는 : http://rhoden.id.au/doc/sockets2.html는 그것을 쉽게 경우, 비 블로킹으로 소켓을 설정하는 것보다 다른

+0

소켓을 비 차단 모드로 설정 한 후 소켓이 SOCKET_ERROR를 반환하면 문제가 발생합니다. –

+0

@Subrat nayak. 나는 스레딩을 볼 필요가 있다고 생각합니다. 그 함수들에 관한 문서들은 에러 (보통 E_WOULDBLOCK과 같은 것)를 반환한다고 알려줄 것이고,이 경우 다시 읽을 수있을 것이다. (아마 조금 자고 싶어서 spinlock하지 않는다.) – sje397

관련 문제