2014-11-07 9 views
-1

원래 게시물 :pthread를 사용할 때 accept()가 stdout (1)에 대한 참조를 반환합니다.

저는 네트워크 프로그래밍을위한 Beej 's Guide에서 네트워크 프로그래밍을 배우고 있습니다. 현재 스레드와 I/O 다중화를 사용하여 여러 연결간에 동시에 통신하기위한 프로토 타입을 만들고 있습니다. 내가 연결을 수신 할 때 새로운 파일 설명자를 반환하는 대신 "new_fd"에 새 파일 설명자를 반환하는 accept()를 호출하면 문제가 발생합니다. 이는 1을 반환하기 때문에 나에게 이해가되지 않습니다. 내 코드에서 stdout을 닫지 않고 accept()는 새로운 파일 디스크립터로서 소켓에 대한 참조를 리턴하고, 스레드가 단일 프로세스에서 동일한 파일 디스크립터를 공유한다는 것을 알고 있다면 문제가되어서는 안된다. 나는 그것을 가지고있다. 나는 문제가 루프백을 사용하여 내 컴퓨터에서 연결되었다고 생각하지만, 내 IP 주소 나 다른 컴퓨터를 참조하여 연결했을 때 fd를 1로 반환하는 것과 같은 오류가 발생했습니다. 명확성을 위해이 편집 http://pastebin.com/APQYjxg9 (I 내 모든 코드를 게시했다)

:이 문제를

원래 게시 된 코드를 해결하기 위해 더 이상 볼 수 있습니다. 내 코드에는 두 가지 문제가있었습니다. 첫 번째는 .. 바로 R에 의해 지적되었다 그 코드는 여기에 있습니다 : 나중에 잘못 내 대답을 게시 무엇인지 파악

if (value = pthread_create((chat+chat_count), NULL, chatDaemon, (void *) &new_fd) != 0) 
{ -snip- } 

void * chatDaemon(void * fd) 
{ 
    int my_fd = *((int *)fd); 
    -snip- 
} 

. 코드는 여기에 스 니펫 :

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1) { -snip-} 

답변

2

너무 오래 지나서 다시 방문하십시오. R ..이 지적한 동기화 부족으로 인해 문제가 발생했지만 문제가 발생하지 않았습니다. 그것은 동의 논리를 갖는 작은 구문 오류가 내가 원래 평가하여 작성하고 항상 true 1을 반환했다 new_fd하는 데 동의에 부울 검사의 결과를 반환으로

if (new_fd = accept(listen_fd, (struct sockaddr*) &(remoteHost), &addrlen) != -1) 

했다 간단했다. 나는 그 당시에 C가 그런 식으로 명령을 내리고 그것을 괄호로 고정한다는 것을 깨닫지 못했습니다.

if ((new_fd = accept(listen_fd, (struct sockaddr*) &remoteHost), &addrelen)) != -1) 
+0

어, 죄송합니다. 나는 이것을 잡지 못했습니다. "- 벽"은 그것을 잡았을 것이다. –

1

귀하의 문제는 chatDaemon*(int *)fd 읽기 동기의 부족이 될 것으로 보인다. fd은 로컬 변수 new_fd에 대한 포인터이며 이 읽을 때 또는 수정하기 전에 수정 될 수있는 main에 정의되지 않은 동작을 호출합니다. int에 fd를 저장하기위한 저장 공간을 할당하고 chatDaemon을 사용 가능하게 설정하거나 void *으로 캐스팅하고 참조로 fd를 전달하지 말고 (선호)합니다.

+0

내가 표준이 그 sizeof 연산자를 보장하지 않습니다 확신 (무효 *)> =를 sizeof (INT)이 너무 정의되지 않은 것 때문에 – Voo

+0

@Voo : 아니, 단지 구현이 정의. 원하는 경우 비용을 들이면 완전히 휴대 할 수있는 트릭이 있습니다. –

+0

정수보다 포인터가 큰 구현은 이론적으로 가능하므로 생각하면 어떻게할까요? 재미있는 질문. – Voo