스레드 생성뒤 소켓 번호가..

익명 사용자의 이미지

서버 프로그램에서 클라이언트 하나 접속할때마다 쓰레드를 생성합니다.
클라이언트 정보는 구조체로 넣어서 인자로 넘기거든요..

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으로만 나옵니다.
ㅡㅡ;; 왜그런건지..

그리구!! 쓰레드 생성하는거. 저렇게 하면 되는건가요??

익명 사용자의 이미지

소스가 너무 간단하게 설명이 되어있어서 두번째 소켓이 0이 되는
이유를 정확히는 모르겠지만 버그의 소지가 생길수 있는 부분이
있군요...먼저 Adata 구조체 변수를 전역으로 선언하시면
각 쓰레드에서 그 변수를 공유하기 때문에 충돌이 일어날수 있습니다.

각 클라이언트 소켓 번호를 따로 저장하는 리스트를 만들던가 아님 다른
방법을 사용해야 할것 같습니다.

혹시 이것 때문에 그럴수도....

익명 사용자의 이미지

답변 감사드립니다..

음... 구조체를.. 그렇게 사용하면.. 그런 문제가 생길수 있군요...
근데.. 그게... 그렇게..ㅡㅡ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)이부분을 지우고 해보
니.. 소켓 번호가 잘 나오더군요... 여기서 왜 걸리는건지. 모르겠씁니
다..

익명 사용자의 이미지

쓰레드 함수에 매개변수로 넘기는것은 포인터 문제가 아니구요
전역변수는 모든 쓰레드에서 공유가 되기 때문에 쓰레드사이에서
충돌이 일어납니다.. 그래서 각 쓰레드별로 소켓번호를 따로 저장
하던가 매개변수로 넘겨주던가 해서 쓰레드별로 소켓번호가 충돌이
일어나지 않도록 해야 합니다..

그리고 쓰레드에서 sock 변수를 close하시는데 실질적으로
sock 변수를 선언을 하시고 변수 초기화나 값을 할당하지 않더군요..^^

이것도 버그의 소지가 있겠네요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.