한 번에 한 번에 32768 바이트를 하나의 TCP 소켓에서 다른 TCP 소켓으로 보내십시오.

StackOverflow https://stackoverflow.com/questions/2224550

문제

안녕하세요 여러분,이 질문이 아직 요청되었는지 모르겠지만 다음과 같은 상황을 상상해보십시오.

두 개의 TCP-Socket이 있습니다 (열린 NSSocketPort 두 사람과 함께 듣고 있습니다 NSFileHandle) 그리고 지금 나는 몇 가지를 보내고 싶다 NSData 그들 사이에.

@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

내가 보내고 싶을 때까지 모든 것이 옳습니다 NSData 길이가 32768 바이트 인 인스턴스. 이 수의 바이트가 전송되지 않습니다. 그래서 여기 내 질문이 있습니다.

1) 코코아가 한 번에 32768 바이트를 보낼 수없는 이유는 무엇입니까?
2) 해결 방법을 만들어야합니까?
3) 그렇다면 데이터를 분할하지만 어떻게 하시겠습니까? 다른 소켓은 모든 데이터가 전송 될 때 어떻게 알 수 있습니까?

그건 그렇고,이 싱글을 보낸 후 NSData 인스턴스 두 소켓이 다시 닫아야합니다.

도움이 되었습니까?

해결책

한 번에 전송 된 데이터의 양은 기본 프레임 워크 및 라이브러리가 사용하는 버퍼의 크기에 따라 다릅니다. 구성 가능할 수 있지만 대부분 관련이 없습니다. TCP의 장점은 데이터 (하나 이상의 패킷)에 데이터를 전달하거나 우아하게 실패한다는 것입니다.

  1. 전송하기 전에 데이터를 분할 할 필요가 없습니다. 기본 시스템이 당신을 위해 그렇게 할 것입니다.
  2. 수신 종료시 사용 가능한 데이터를 읽은 다음 더 많은 바이트가 도착할 때까지 기다렸다가 더 이상 데이터를 사용할 수 없을 때까지 기다릴 수 있습니다. 발신자가 데이터 전송을 완료하면 소켓이 닫히고 수신기가 알림을받습니다.

다른 팁

당신의 문제는 코코아에 대한 것이 아니라 스트림 소켓에 대한 개념적 오해 인 것 같습니다.

TCP는 스트림 프로토콜입니다. 별도의 글의 경계는 유지되지 않습니다.

32768 바이트를 보내는 경우, 수신 종료는 readData (또는 그것이 호출되는 것)를 위해 준비해야합니다. 단일 바이트 32768 바이트. 32768 바이트가 미만인 경우 나머지를 얻으려면 다시 읽어야합니다. 아니면 나머지는 모두가 아니며 다시 읽어야합니다. 네트워크 프로토콜을 설계하는 것은 귀하에게 달려 있으므로 수신 목록이 모든 데이터를 얻었을 때를 알 수 있습니다. 예를 들어 길이로 데이터를 접두사로 만듭니다.

Writedata가 보내는 데이터보다 적게 보내면 보내기를 보내려면 나머지 데이터로 Writedata를 다시 전화하십시오. 그리고 준비하십시오 저것 요청한 것보다 적게 보내려면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top