recv 함수 예제

Posted by abitou on Αυγ 02, 2019

이제 recv에 대한 마지막 호출에서 recv는 CHUNK_SIZE 데이터 양을 얻거나 30 초에서 1 분까지 될 수있는 기본 시간 초과가 발생할 때까지 차단합니다. 이 응용 프로그램을 기다리는 것이 너무 많을 수 있습니다. 위의 예에서 소켓은 차단 유지 될 수있다. 그런 다음 recv 함수는 MSG_DONTWAIT 연결 지향 소켓(예: SOCK_STREAM 유형)의 플래그를 사용해야 하며, recv를 호출하면 현재 사용 가능한 만큼의 데이터가 지정된 버퍼 크기까지 반환됩니다. OOB 데이터(소켓 옵션 SO_OOBINLINE)의 인라인 수신을 위해 소켓이 구성되었으며 OOB 데이터가 아직 읽지 않은 경우 OOB 데이터만 반환됩니다. 응용 프로그램은 ioctlsocket 또는 WSAIoctlSIOCATMARK 명령을 사용하여 더 이상 OOB 데이터를 읽을 수 있는지 여부를 결정할 수 있습니다. 두 함수 모두 소켓 설명자 s, 버퍼 buf에 대한 포인터, 버퍼 렌의 크기(바이트) 및 함수 작동 방식을 제어하는 플래그 집합을 사용합니다. 대역 외 데이터를 수신합니다. 이것은 send()에서 MSG_OOB 플래그를 사용하여 전송된 데이터를 얻는 방법입니다. 수신 측으로, 당신은 긴급 데이터가 있음을 말하는 SIGURG 제기 신호를했을 것이다. 해당 신호에 대한 처리기에서 이 MSG_OOB 플래그를 통해 recv()를 호출할 수 있습니다.

또한 recvfrom()는 구조형 sockaddr*를 사용하여 데이터가 어디에서 왔는지 알려주며 구조형 sockaddr의 크기로 채울 것입니다. (또한 에서 초기화 해야 합니다.) 또는 구조형 sockaddr에서 크기로. 요청이 발생하면 accept 함수를 호출하여 요청을 처리합니다. recv_timeout 함수는 지정된 최대 시간 아웃이 있는 소켓에서 데이터를 수신합니다. 위의 프로그램은 닫는 HTML 태그까지 www.msn.com 전체 HTML 콘텐츠를 가져와야합니다. int receive_basic (int s_fd) // recv {int rcvBytes, loopRcvd = 0, totalRcvd = 0; char chunk[CHUNK_SIZE]; recv())에게 len 매개 변수에 지정한 모든 데이터가 반환되지 않도록 지시합니다. 그러나 신호가 통화를 중단하거나 일부 오류가 발생하거나 원격 측이 연결을 닫는 경우와 같이 극단적 인 상황에서는 사용자의 소원을 무시합니다. 그것으로 화내지 마십시오. 구조체 시간 제 TV = {TO_SEC, TO_USEC}; 세토크옵트(s_fd, SOL_SOCKET, SO_RCVTIMEO, TV, sizeof(tv)); while (1) { memset (청크, 0, CHUNK_SIZE); ((rcvBytes = recv (s_fd, 청크, sizeof (청크), 0)) >n%sn», rcvBytes, loopRcvd, 청크); } 소켓이 연결되면 recv() (TCP SOCK_STREAM 소켓의 경우) 및 recvfrom(UDP SOCK_DGRAM 소켓의 경우)를 사용하여 원격 측에서 들어오는 데이터를 읽을 수 있습니다. 소켓에서 들어오는 데이터를 사용할 수 없는 경우 recv() 호출블록은 WSARecv()에 정의된 차단 규칙에 따라 데이터가 도착할 때까지 기다립니다. 이 경우 WSAEWOULDBLOCK으로 설정된 오류 코드와 함께 SOCKET_ERROR 값이 반환됩니다. select(), WSAAsyncSelect() 또는 WSAEventSelect() 함수를 사용하여 더 많은 데이터가 도착하는 시기를 결정할 수 있습니다.

소켓이 연결 지향적이고 원격 측이 연결을 정상적으로 종료하고 모든 데이터가 수신된 경우 recv()는 수신된 바이트가 0으로 즉시 완료됩니다. 연결이 재설정되면 recv()가 WSAECONNRESET 오류로 실패합니다.

Comments are closed.

Ο καιρός

ar8ra

advertisement