2010-03-29 2 views
1

C (Beej 참조)의 소켓 프로그래밍에 대해 배우고 있습니다. 런타임에 http://pastebin.com/gDzd0WqPC 소켓 프로그래밍, select() 및 fd_set의 문제점

, 그것은 버스 오류를 제공합니다 : 여기

내가 구현하기 위해 노력하고있어 간단한 다중 사용자 채팅 서버입니다. 그것은 68-78 행에서 나옵니다.

문제의 출처를 추적 해 주시겠습니까?

실제로 코드가 특정 지역에 도달하는 이유는 무엇입니까? 방금 서버를 실행했습니다. @

ps - 내 코드가 매우 신뢰할 수 없다는 것을 알고 있지만 (아무런 오류 검사도하지 않음), 나중에이를 수행 할 것입니다. 코드의 기능을 테스트하기를 원합니다. 81

msg[MSG_SIZE] = '\0';` 

당신의 버퍼 오버런

답변

3

선), 모든 그것의 영광을 구현. 또한 실패 할 수있는 모든 호출의 반환 값을 확인하는 필요

msg[MSG_SIZE - 1] = '\0';` 

당신 확인, 그 라인 39,42,45,68 80

편집이다 : 그리고 당신은 확인 더라면 오류가 발생하면 accept() 호출이 실패합니다. 소켓이 수신 대기 모드가 아닌 것 같습니다. 즉 listen()에 대한 전화가 누락되었습니다.

+0

감사합니다. 그러나 주된 질문은 왜 서버가 실행 중이며 클라이언트가 연결되어 있지 않기 때문에 THAT 영역의 런타임입니다. 이것이 처리되지 않은 오류의 가능한 경우입니까? – Bojack

+0

그것은 가능할뿐만 아니라 정확하게 발생합니다. – nos

+0

좋아, 먼저 그들에 대해 연구하겠습니다. 감사합니다 :) – Bojack

1

또 다른 고려 사항은 ' 단순 할당으로 변수 fd_set을 복사해야합니다. 이들을 처리 할 수있는 유일한 휴대용 방법은 매번 활성 파일 설명자 목록을 반복함으로써 처음부터 fd_set을 재생성하는 것입니다.