getline과 동일한 작업을 수행하지만 FILE * 스트림 대신 연결된 소켓에서 작동하는 libc 함수가 있습니까?소켓을 통한 getline
해결 방법은 소켓에서 fdopen을 호출하는 것입니다. 그렇게 할 때 돌봐야 할 것이 무엇입니까? 그것을하는 이유는 무엇입니까 /하지 마십시오.
getline과 co를 호출하는 분명한 이유가 있지만 맞춤 getline을 다시 작성하는 것이 더 좋은 방법일까요?
getline과 동일한 작업을 수행하지만 FILE * 스트림 대신 연결된 소켓에서 작동하는 libc 함수가 있습니까?소켓을 통한 getline
해결 방법은 소켓에서 fdopen을 호출하는 것입니다. 그렇게 할 때 돌봐야 할 것이 무엇입니까? 그것을하는 이유는 무엇입니까 /하지 마십시오.
getline과 co를 호출하는 분명한 이유가 있지만 맞춤 getline을 다시 작성하는 것이 더 좋은 방법일까요?
소켓에서 읽기를 호출하면 중간에 0 값을 반환 할 수 있습니다. 예.
read(fd, buf, bufsize)
은 tcp 소켓의 커널 버퍼가 가득 찬 경우 bufsize보다 작은 값을 반환 할 수 있습니다. 이 경우 0 또는 음수의 결과를 반환하지 않으면 read 함수를 다시 호출해야 할 수도 있습니다.
따라서 stdio 기능을 피하는 것이 가장 좋습니다. 당신은 bufsize 바이트를 안정적으로 얻기위한 read를위한 반복적 인 호출을 구현하기 위해서 read 함수를위한 래퍼를 생성 할 필요가있다. 마치 파일이 로컬 디스크에서 읽히는 것처럼 더 이상 바이트를 소켓에서 읽을 수 없을 때만 0을 반환해야합니다.
Randal Bryant가 Computer Systems: A Programmer's Perspective 책에서 래퍼를 찾을 수 있습니다.
소스 코드는 this 사이트에서 입수 할 수 있습니다. rio_로 시작하는 함수를 찾으십시오.
새 행 (\ n 또는 \ r \ n, 구현에 따라 다름)을받지 못하면 프로그램이 중단됩니다. select()를 호출하여 소켓이 여전히 읽기/쓰기 가능하고 오류가 없는지 확인하는 자체 버전을 작성합니다. 실제로 다른 "\ n"또는 "\ r \ n"이 오는지 알 수있는 방법이 없으므로 클라이언트/서버의 데이터가 일관성이 있다는 것을 알고 있어야합니다.
getline()을 사용하여 머리글을 읽는 웹 서버를 코딩했다고 가정 해보십시오. 단순한 공격자가 보낸 경우
GET/HTTP/1.1\r\n
This line isn't terminated: bla
getline은 결코 반환되지 않으며 프로그램이 중단됩니다. 아마 자원과 결국 DoS 비용이들 것입니다. 소켓은 신뢰할 수없는 입력에 연결되어있는 경우
는 \ R \ n
한 가지 방법