Re: [Linux-programlama] accept() fonksiyonu...

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Cem Vedat ISIK (cvi.list@gmail.com)
Date: Fri 16 Feb 2007 - 15:57:51 EET


Ilginiz icin tesekkur ederim.
Asagida, kodun main()'inin kirpilmamis hali [1] asagida bulunuyor.
Kullandigim header'lar, <sys/types.h>, <sys/socket.h>, <netdb.h>,
<stdio.h>, <unistd.h>, <stdlib.h>, <string.h> ve <pthread.h>.
Derlerken bagladigim tek library ise, "pthread".

[1]

int main()
{
   int receiverSock, servLen, newSock;

   struct sockaddr_in servAddr;

   bzero(&servAddr, sizeof(servAddr));
   receiverSock = socket( AF_INET, SOCK_STREAM, 0 ); // creates
receiving socket
   servAddr.sin_family = AF_INET;
   servAddr.sin_addr.s_addr = htonl( INADDR_ANY );
   servAddr.sin_port = htons( SERVER_PORT );
   bind( receiverSock, ( struct sockaddr * ) &servAddr, sizeof(
servAddr ) ); // binds receiving port

   listen( receiverSock, MAX_CONNECTIONS ); // MAX_CONNECTIONS is
max. length of queue of pending connections
   while ( 1 ) // listens connections and accepts them to newSock
   {
      newSock = accept( receiverSock, (struct sockaddr *) &servAddr, &servLen );
      #ifdef DEBUG
      printf( ": socket created with no: %d\n", newSock );
      #endif
      pthread_create( &sql_tid, NULL, ( void *)process_xxx, &newSock );
   }
   close( receiverSock );
   return 0;
}

EOF

pthread_create ile cagirdigim, process_xxx'a gelen newSock degeri ayni
oldugundan, aklima ilk gelen accept()'in ayni socket degerini
dondurdugu geldi. Isin ilginc yani, bu her zaman olan bir durum
degil.

Bu maili yazarken, Caglar Bey'in bahsettigi durumun olusup
olusmadigini simdi debug mesaji ekleyerek test ettim. Sunucu
uygulamami debug modda calistirdigimda,

: socket created with no: 63
: socket created with no: 64 ( evet, sevgili Caglar Bey'in dedigi
gibi, socket'ler farkli yaratiliyor.)
: thread created 64
: thread created 64 ( ancak thread'e giderken ayni socket gidiyor )

[......]
: thread exited 64
: thread exited 64 ( gercekten de oyle... )

Simdi en azindan accept()'in dogru calistigini biliyorum. Pekiyi,
pthread_create'e arguman olarak gelen newSock'un thread sonlanana
kadar hafizada kalacagini nasil garanti edebilirim?
Yardimlariniz icin simdiden cok tesekkurler.
Saygilar.

On 16/02/07, Barcin Alpcigay <barcin.alpcigay@ceng.metu.edu.tr> wrote:
> Sn.Akyuz ve Sn.Isik,
> verilen program parcacigina bakarak yorum yapmak yaniltici olur. Verilen kod
> parcasindan accept() bekleyen ne socket'in type'ini cikarmak mumkun degil,
> SEQPACKET kullanıyorsanız sonuç farklı, DGRAM kullanıyorsanız sonuç farklı
> olur, o yüzden accept()'in size aynı socket number'ı vermesinin bir
> açıklaması olabilmesi için tüm nitelikleri vermeniz lazım. SYS V IPC'den
> hangi library'leri kullanıyorsunuz?
>
> On Fri, 16 Feb 2007 10:56:04 +0200, Çağlar AKYÜZ wrote
> > Cem Vedat ISIK yazmış:
> > > Merhabalar, oncelikle bu e-postayi birden fazla alanlardan simdiden
> > > özür diliyorum, ancak ikisi ile de ilgili oldugunu dusundum. Gelelim
> > > soru(nu)ma,
> > >
> > > [...kestim...]
> > >
> > > listen( receiverSock, MAX_CONNECTIONS ); // MAX_CONNECTIONS is
> > > max. length of queue of pending connections
> > >
> > > while ( 1 ) // listens connections and accepts them to newSock
> > > {
> > > newSock = accept( receiverSock, (struct sockaddr *) &servAddr,
> > > &servLen );
> > > pthread_create( &sql_tid, NULL, ( void *)process_xxx, &newSock );
> > > }
> >
> > Kanımca buradaki sorun pthread_create geçilen *arg değerinde.(yani
> > &newSock). Şöyle bir senaryo olsun:
> >
> > 1) Connection request geldi,accept ile kabul ettik(socket = 1).
> > pthread_create ile yeni thread(thread1) request yaptık. Ama kernel
> > request'i hemen işletmedi.
> > 2) Hemen ardından(1 ms diyelim) , yeni bir connection request
> > geldi.Accept ile kabul ettik.(socket = 2). pthread_create ile yeni
> > thread(thread2) request yaptık. Kernel bunu gene
> > sıraya koydu.
> > 3)Kernel ilk thread'i oluşturmaya karar verdi.Socket değişkenini
> > okudu.(oops! şu an 2 ama!).
> > 4)Kernel ikinci thread'i oluşturmaya karar verd. Socket değişkenini
> > okudu. (ne güzel 2 şu an.)
> > 5) Sonuç iki thread'e de 2 numaralı socket'i geçmiş oldunuz. Birinci
> > badem oldu :)
> >
> > pthread_create yardım sayfasından :
> > / "The calling function must ensure that arg remains valid for
> > the new thread throughout its lifetime"
> >
> > /Yani her bir thread için geçtiğiniz arg değeri thread yok edilene
> > kadar memory de bulunmalı ki bu örnekteki durum bu değil diye düşünüyorum.
> >
> > Saygılarımla
> > Çağlar AKYÜZ
> >
> > Not : Yolladığınız kod içinde ingilizce yorumlar olduğu için daha
> > hızlı cevap verebilmek için ben de ingilizce kullandım.
> > Uygunsuzluk için şimdiden özür dilerim.

-- 
Cem Vedat ISIK
http://isik.net

_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.