programing

C 및 Linux에서 소켓에 사용 가능한 데이터 양을 확인하는 방법

iphone6s 2023. 10. 14. 09:55
반응형

C 및 Linux에서 소켓에 사용 가능한 데이터 양을 확인하는 방법

저는 연속적인 데이터 스트림을 수신하는 서버를 가지고 있습니다.소켓에서 여러 번 읽는 것이 아니라, 한 번의 시스템 호출로 소켓 수신 버퍼의 전체 데이터를 읽고 싶습니다.read().

물론 나는 큰 버퍼를 통과할 수 있고 그리고read()사용 가능한 모든 데이터로 채우려고 할 것입니다.그러나 이는 대부분의 경우 몰로크 버퍼가 소켓에서 사용 가능한 실제 데이터보다 크기 때문에 많은 메모리를 낭비하게 됩니다.소켓에서 사용 가능한 데이터를 조회할 수 있는 방법이 있습니까?

예:

#include <sys/ioctl.h>

...

int count;
ioctl(fd, FIONREAD, &count);

아뇨, 없습니다.이를 위한 방법이 있다 하더라도 새로운 데이터가 언제든지 도착할 수 있기 때문에 답변은 즉시 최신 상태가 아닐 것입니다.

버퍼를 다음 위치로 전달할 때read(), 버퍼가 완전히 채워질 때까지 기다리는 대신 읽을 데이터(최소 1바이트)가 있으면 함수가 반환됩니다.

이 경우 Non-blocking 소켓을 사용하거나 ()/poll()을 선택할 수 있습니다.저는 새로운 데이터를 기다리면서 다른 일을 할 수 있기 때문에 비차단 소켓을 선호합니다.

다음은 "일종의" 대답입니다.recv(char* buffer, size_t nytes, int flags)플래그가 OR로 표시되는 경우:

MSG_PEEK
This flag causes the receive operation to return data from the beginning of the receive queue without removing that data from the queue. Thus, a subsequent receive call will return the same data.

버퍼를 비가역적으로 읽지 않고 임의 수의 바이트가 버퍼에 존재하는지 확인할 수 있도록 합니다.이는 가장 효율적인 방법이 아니기 때문에 반답형이며, MSG_PEEK는 일반적으로 메시지가 알려진 길이 헤더를 가진 경우 다음과 같이 사용됩니다.

000123DT001    

어디에00123헤더를 포함한 전체 메시지의 길이입니다.DT는 메시지의 종류이고,001보낸 사람이 재시도한 횟수입니다.이 개념은 메시지를 완전히 읽는 바이트 수를 알려주는 무언가를 가져올 수 있다는 것입니다.메시지에 관심이 없습니다.하지만 그것이 뒤에 있는 이유입니다.MSG_PEEK

문자별로 소켓 문자로 읽고 쓸 수 있기 때문에 메모리 낭비가 없고 통신이 더 잘 될 뿐만 아니라 명령어 송수신을 시도해야 합니다.

시스템 호출로 인한 오버헤드를 줄이기 위해 한 번의 시스템 호출로 많은 패킷을 받으려는 것 같습니다.

리눅스 2.4 또는 2.6+ 커널용 패킷 소켓 인터페이스를 시도해 볼 수 있습니다. http://lxr.free-electrons.com/source/Documentation/networking/packet_mmap.txt

언급URL : https://stackoverflow.com/questions/14047802/how-to-check-amount-of-data-available-for-a-socket-in-c-and-linux

반응형