Re: koledzy, pomozcie...

Autor: Przemyslaw Dobrowolski (dobrawka_at_asua.org.pl)
Data: Mon 28 May 2001 - 22:21:26 MET DST


On Mon, 28 May 2001 19:27:15 +0200 (MET DST), Lech Wiktor Piotrowski wrote:

>nie na te liste, bo to na (fuuj) linuxie, jako ze na taki system piszemy na uczelni, ale
pisze
>program na zaliczenie i mi sie wywala na segmentation fault. Jest to prosty klient
muda.

Po pierwsze - sorry, ale musze to powiedziec. Twój kod jest mało przejrzysty. W pętli
należy mieć jakiś niezmiennik, a tu go nie widać. Po drugie używaj jakiejś notacji, bo
trudno jest zrozumieć o co Ci chodzi.

Błąd wygląda tak. strcpy robi kopiowanie do \0, natomiast soket nie wypełni Ci po
otrzymanych danych zerem (on czeka na 1024 bajty danych). Jeśli miałeś farta i gdzieś
było zero to strcpy się uda... A jeśli nie to sorry.
Oprócz w/w to brakuje returna (masz zwrócić void *). Po bugu VC++ 6.0 bardzo tego
pilnuję.
Po drugie czemu chcesz przeczytać od razu aż kilobajt, czy nie lepiej czytać bajt po
bajcie?

BTW: W linijce:
// memset(&send_buffer, 0, 1025);
też powinno Ci się to wszystko pochrzanić
robisz operację na char **

Poniżej troszkę sobie musiałem opisać po swojemu Twój kod. Wiem, że notacji tej nikt
pod linuxem nie używa, ale napisałeś na listę o OS/2 :-)

BTW2: Spróbuj zrobić jeden wątek w którym tylko czytasz z socketa (w jakims buforze
cyklicznym, czy czymkolwiek, thread ten moglby wypelniac bufor. Pamietaj w tym
momencie, ze jak wypelniasz bufor w innym tasku to nalezy uzyc semaforow.

[...]

>void *sendrecv(void *sock)
>{
// char *pBuffer=(char *)malloc(1025);
> char *rbuffer=(char *)malloc(1025);
// int nRet=1;
> int ret = 1;
> int i=0, y=0;
// char *pSendBuffer=(char *)malloc(1025);
> char *send_buffer=(char *)malloc(1025);
// int nBlad;
> int blad;
> char zwrot[32];
// int flDontBlock;
> int dontblock;
// char *pBladc = (char *)malloc(30);
> char *bladc = (char *)malloc(30);
// ??????????
> int c[2000];
> int c_count=0;
// Dopóki zwrot nie -1
> while (ret!=-1)
> {
> dontblock=1;
// i tu tkwi problem
//----------------------
// nRet = recv((int)sock, pBuffer, 1024, 0);
> ret = recv((int)sock, rbuffer, 1024, 0);
//
> strcpy(send_buffer, rbuffer);
//----------------------

---
*Przemek/2* - dobrawka_at_asua.org.pl - ICQ: 18642806
Asua Programmers http://www.asua.org.pl
TeamOS/2pl http://www.teamos2.org.pl
This OS/2 system uptime is 0d 1h 09m 29s 820ms (en).


To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 15:32:04 MET DST