문제

IAM은 데이터 그램 소켓 (UDP)을 기반으로 반복 서버를 작성하려고합니다. 첫 번째 recvfrom () 호출에서 얻은 첫 번째 클라이언트에 연결합니다 (예, 이것이 실제 연결이 없다는 것을 알고 있습니다). 이 클라이언트에 서비스를 제공 한 후 UDP 소켓 (AF_UNSPEC로 연결 호출)을 분리 한 다음 RecVFrom ()을 호출하여 다음 클라이언트로부터 첫 번째 패킷을 얻습니다.

이제 문제는 루프의 두 번째 반복에서 recvfrom ()의 호출이 0을 반환한다는 것입니다. 내 클라이언트는 빈 패킷을 보내지 않으므로 어떻게 진행될 수 있는지.

이것이 IAM 이하는 일 (pseudocode)입니다.

s = socket(PF_INET, SOCK_DGRAM, 0)

bind(s)

for(;;)
{
  recvfrom(s, header, &client_address)  // get first packet from client
  connect(s,client_address)  // connect to this client
  serve_client(s);
  connect(s, AF_UNSPEC); // disconnect, ready to serve next client
}

편집 : 클라이언트의 버그가 실수로 빈 패킷을 보내는 것을 발견했습니다. 이제 내 문제는 고객이 요청을 어디에도 보내지 않고 서비스를 기다리는 방법입니다 (서버는 다른 클라이언트와 연결되어 있고 다른 클라이언트에 서비스를 제공하지 않습니다).

도움이 되었습니까?

해결책

Connect ()는 SOCK_DGRAM에서 완전히 불필요합니다.

Connect 호출 다른 호스트로부터 패킷을받는 것을 멈추지 않습니다, 또한 당신이 그들을 보내는 것을 막지 않습니다. 귀찮게하지 말고 정말 도움이되지 않습니다.

수정 : 예, 다른 호스트로부터 패킷을받는 것을 막는 것 같습니다. 그러나 서버 에서이 작업을 수행하는 것은 다른 클라이언트가 연결되어있는 동안 ()에 연결된 상태에서 잠겨 있기 때문에 약간 어리석은 일입니다. 또한 여전히 떠 다니는 "Chaff"를 잡아야합니다. DGRAM 소켓에는 Connect ()와 관련된 일부 레이스 조건이있을 수 있습니다. Connect를 호출하고 다른 호스트의 패킷이 이미 버퍼에 있으면 어떻게됩니까?

또한 0은 비어있는 (데이터 없음) 패킷이 유효하고 존재할 수 있으므로 RecvFrom ()의 유효한 반환 값입니다 (실제로 사람들은 종종 사용). 따라서 무언가가 그런 식으로 성공했는지 확인할 수 없습니다.

모든 가능성에 따라 제로 바이트 패킷은 이미 줄에있었습니다.

잘못된 데이터 그램이 잘못 해석 될 가능성을 최소화하기 위해 프로토콜을 설계해야합니다. 이러한 이유로 나는 빈 데이터 그램을 사용하지 않고 대신 마법 번호를 사용하는 것이 좋습니다.

UDP 응용 프로그램은 "Chaff"패킷을 인식하고 떨어 뜨릴 수 있어야합니다. 그들은 조만간 나타날 것입니다.

다른 팁

man connect:

...
If the initiating socket is not connection-mode, then connect()
shall set the socket’s peer address, and no connection is made.
For SOCK_DGRAM sockets, the peer address identifies where all
datagrams are sent on subsequent send() functions, and limits
the remote sender for subsequent recv() functions. If address
is a null address for the protocol,  the  socket’s  peer  address
shall be reset.
...

내가했던 것처럼 누군가가 이것을 가로 질러 감염 될 경우를 대비하여 수정 한 것입니다. 연결을 끊으려면 Connect ()를 AF_UNSPEC로 설정 한 SAYDADDR의 SA_FAMILY 멤버와 함께 호출해야합니다. AF_UNSPEC을 통과 한 것이 아닙니다.

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