스레드 생성뒤 소켓 번호가..
글쓴이: 익명 사용자 / 작성시간: 월, 2002/05/13 - 10:12오전
서버 프로그램에서 클라이언트 하나 접속할때마다 쓰레드를 생성합니다.
클라이언트 정보는 구조체로 넣어서 인자로 넘기거든요..
struct t_data
{
int a;
int b;
}
struct t_data Adata;
pthread_t ccc;
while
{
client_sock = accept(~~~~~~);
printf("Socket %d\n", client_sock);
Adata.a = client_sock;
Adata.b = ~~~~~
pthread_create(&ccc, NULL, f, (void*)&Adata;
}
대충 이런식으로 했습니다.근데..문제는..
첫번째 접속을 받으면 소켓 번호가 잘 나옵니다..
근데 .. 두번째부터는 소켓 번호(client_sock)가 계속 0으로만 나옵니다.
ㅡㅡ;; 왜그런건지..
그리구!! 쓰레드 생성하는거. 저렇게 하면 되는건가요??
Forums:
Re: 스레드 생성뒤 소켓 번호가..
소스가 너무 간단하게 설명이 되어있어서 두번째 소켓이 0이 되는
이유를 정확히는 모르겠지만 버그의 소지가 생길수 있는 부분이
있군요...먼저 Adata 구조체 변수를 전역으로 선언하시면
각 쓰레드에서 그 변수를 공유하기 때문에 충돌이 일어날수 있습니다.
각 클라이언트 소켓 번호를 따로 저장하는 리스트를 만들던가 아님 다른
방법을 사용해야 할것 같습니다.
혹시 이것 때문에 그럴수도....
Re^2: 소켓 close하는 부분에서..
답변 감사드립니다..
음... 구조체를.. 그렇게 사용하면.. 그런 문제가 생길수 있군요...
근데.. 그게... 그렇게..ㅡㅡaaa넘기면.. 그냥 주소만 넘기는건가요?
값을 복사? 하는게 아니구요?? .. C 포인터를 아직두 정확히 이해를 못해
서... ㅜ.ㅜjava할대는 포인터 같은거 없어서 좋았는뎅..
주소 넘기는거 말구. 값을 복사할수는 없을까요?? 움.. 질문이 이상한가
요?? 그래두... 이해하셨으리라.. 믿습니다..^^;;
스레드 생성(create) 할때 호출하는 함수가여.
void * f(void *args)
{
int sock;
int j_val;
struct dd *arg = (struct dd *)args;
printf("Thread %d\n", pthread_self());
printf("data %d\n", arg->ThreadNum);
printf("data %d\n", arg->SockNum);
close(sock); //-> 요기에여...
pthread_exit(0);
thread[j_val] = 0;
}
.
이런식이거든여.. 움.. 근데.. 여기서 close(sock)이부분을 지우고 해보
니.. 소켓 번호가 잘 나오더군요... 여기서 왜 걸리는건지. 모르겠씁니
다..
Re^3: 소켓 close하는 부분에서..
쓰레드 함수에 매개변수로 넘기는것은 포인터 문제가 아니구요
전역변수는 모든 쓰레드에서 공유가 되기 때문에 쓰레드사이에서
충돌이 일어납니다.. 그래서 각 쓰레드별로 소켓번호를 따로 저장
하던가 매개변수로 넘겨주던가 해서 쓰레드별로 소켓번호가 충돌이
일어나지 않도록 해야 합니다..
그리고 쓰레드에서 sock 변수를 close하시는데 실질적으로
sock 변수를 선언을 하시고 변수 초기화나 값을 할당하지 않더군요..^^
이것도 버그의 소지가 있겠네요..
댓글 달기