2009-10-19 4 views
4

getline과 동일한 작업을 수행하지만 FILE * 스트림 대신 연결된 소켓에서 작동하는 libc 함수가 있습니까?소켓을 통한 getline

해결 방법은 소켓에서 fdopen을 호출하는 것입니다. 그렇게 할 때 돌봐야 할 것이 무엇입니까? 그것을하는 이유는 무엇입니까 /하지 마십시오.

getline과 co를 호출하는 분명한 이유가 있지만 맞춤 getline을 다시 작성하는 것이 더 좋은 방법일까요?

답변

3

소켓에서 읽기를 호출하면 중간에 0 값을 반환 할 수 있습니다. 예.

read(fd, buf, bufsize) 

은 tcp 소켓의 커널 버퍼가 가득 찬 경우 bufsize보다 작은 값을 반환 할 수 있습니다. 이 경우 0 또는 음수의 결과를 반환하지 않으면 read 함수를 다시 호출해야 할 수도 있습니다.

따라서 stdio 기능을 피하는 것이 가장 좋습니다. 당신은 bufsize 바이트를 안정적으로 얻기위한 read를위한 반복적 인 호출을 구현하기 위해서 read 함수를위한 래퍼를 생성 할 필요가있다. 마치 파일이 로컬 디스크에서 읽히는 것처럼 더 이상 바이트를 소켓에서 읽을 수 없을 때만 0을 반환해야합니다.

Randal Bryant가 Computer Systems: A Programmer's Perspective 책에서 래퍼를 찾을 수 있습니다.

소스 코드는 this 사이트에서 입수 할 수 있습니다. rio_로 시작하는 함수를 찾으십시오.

2

새 행 (\ n 또는 \ r \ n, 구현에 따라 다름)을받지 못하면 프로그램이 중단됩니다. select()를 호출하여 소켓이 여전히 읽기/쓰기 가능하고 오류가 없는지 확인하는 자체 버전을 작성합니다. 실제로 다른 "\ n"또는 "\ r \ n"이 오는지 알 수있는 방법이 없으므로 클라이언트/서버의 데이터가 일관성이 있다는 것을 알고 있어야합니다.

getline()을 사용하여 머리글을 읽는 웹 서버를 코딩했다고 가정 해보십시오. 단순한 공격자가 보낸 경우

GET/HTTP/1.1\r\n 
This line isn't terminated: bla 

getline은 결코 반환되지 않으며 프로그램이 중단됩니다. 아마 자원과 결국 DoS 비용이들 것입니다. 소켓은 신뢰할 수없는 입력에 연결되어있는 경우

2

는 \ R \ n

  • 는 \ r에 또는 \ n을
  • 중 어떤 영원히 기다려 전에 임의의 시간 프레임

    • \ 0 문자 내에 임의의 입력을 준비

    한 가지 방법

  • 다른 잠재적 추한 것은 임의의 타이밍을 해결하고는 예를 읽고에 임의의 데이터는 시간 제한을 제공하는 것 select (2)를 통해 실제로 수신 한 데이터를 잘 작성된 상태 머신에 바이트 단위로 공급한다.