Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: [C] klient serwer - problem z warningiem  (Przeczytany 5333 razy)

gacmen

  • Gość
[C] klient serwer - problem z warningiem
« dnia: 2007-01-23, 21:53:24 »
Witam!

Mam program, ktory realizuje komunikacje klient-serwer. Program dziala, ale problem mam przy kompilacji programu serwera. Kompiluje sie, ale z warningiem. Nie wiem jak go usunac. Poza tym czasami serwer nie uruchamia sie z powodu 'naruszenia ochrony pamieci', co ma pewnie zwiazek z tym ostrzerzeniem. Prosze o pomoc.

Program serwera

main(void)
{
   int orig_sock,new_sock,clnt_len,i;
   struct sockaddr_in clnt_adr, serv_adr;  //!
   static char buf[10], bux[10];

   if((orig_sock=socket(AF_INET,SOCK_STREAM,0))<0)
   {
      perror("blad generownia");
      exit(1);
   }

   memset(&serv_adr,0,sizeof(serv_adr));
   serv_adr.sin_family=AF_INET;
   serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
   serv_adr.sin_port=htons(PORT);
 
   if(bind(orig_sock,(struct sockaddr*) &serv_adr,sizeof(serv_adr))<0)
   {
      perror("blad dowiazania");
      close(orig_sock);
      exit(2);
   }

   listen(orig_sock,5);
   clnt_len=sizeof(clnt_adr);

   if((new_sock=accept(orig_sock,(struct sockaddr*) &clnt_adr, &clnt_len))<0)
   {
      perror("blad akceptowania");
      close(new_sock);
      exit(3);
   }

   sleep(1);
   read(new_sock,buf,sizeof(buf));

   printf("Otrzymalem od klienta: %sn",buf);
   for(i=0; i<50; i++)
   {
      buf=toupper(buf);
   }
   printf("Wyslalem do klienta: %s",buf);
   sprintf(bux,"%s",buf);
   write(new_sock,bux,sizeof(bux));

   close(new_sock);
        printf("n");
   exit(0);
}

Pozdrawiam.

xavery

  • Gość
[C] klient serwer - problem z warningiem
« Odpowiedź #1 dnia: 2007-01-23, 22:10:39 »
>    static char buf[10], bux[10];
[ciach]
 >    for(i=0; i<50; i++)
 >    {
 >       buf=toupper(buf);
 >    }

Tu kolega przesadził:)
A poza tym czemu bufor ma być statyczny?
A co do warninga to z pewnoscia nie jest to nic groznego chociaz wiecej mozna by bylo powiedziec gdybys zalaczyl ten warning. Wlacz opcje -Wall (jesli jej nie wlaczyles) to zobaczysz wiekszy zestaw ladnych warningow:)

gacmen

  • Gość
[C] klient serwer - problem z warningiem
« Odpowiedź #2 dnia: 2007-01-23, 23:35:29 »
> Tu kolega przesadził:)

No co, mialem za zadanie zrobic cos z przeslanym tekstem ;)

 > A poza tym czemu bufor ma być statyczny?

Hmm w sumie nie wiem. Mialem dany szkielet i musialem dopisac reszte.

 > A co do warninga to z pewnoscia nie jest to nic groznego chociaz wiecej mozna by bylo
 > powiedziec gdybys zalaczyl ten warning.

warning: pointer targets in passing argument 3 of accept differ in signedness
Dotyczy on linii z ostatnim ifem.

> Wlacz opcje -Wall (jesli jej nie wlaczyles) to zobaczysz
 > wiekszy zestaw ladnych warningow:)

Teraz wlaczylem i faktycznie jeszcze kilka jest. Ale tymi przejmowac sie nie bede :)

xavery

  • Gość
[C] klient serwer - problem z warningiem
« Odpowiedź #3 dnia: 2007-01-23, 23:51:27 »
2007-01-23 23:35:29 gacmen napisał:

 > No co, mialem za zadanie zrobic cos z przeslanym tekstem ;)

No to cos zrob ale nei wychodz poza ostani element bufora:)

 > Hmm w sumie nie wiem. Mialem dany szkielet i musialem dopisac reszte.

No to zrob go jako zwykly (nie statyczny)

 > warning: pointer targets in passing argument 3 of accept differ in signedness
 > Dotyczy on linii z ostatnim ifem.

W wywolaniu accept? A wiec wg. man 2 accept prototyp funkcji to:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
Czyli trzeci argument to wskaznik do zmiennej typu socklen_t a nie int jak w Twoim programiku



chmooreck

  • Gość
[C] klient serwer - problem z warningiem
« Odpowiedź #4 dnia: 2007-01-24, 07:43:10 »
2007-01-23 23:51:27 xavery napisał:

 > W wywolaniu accept? A wiec wg. man 2 accept prototyp funkcji to:
 > int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 > Czyli trzeci argument to wskaznik do zmiennej typu socklen_t a nie int jak w Twoim programiku

w tym samym manie jest napisane, że socklen_t musi być tej samej wielkości, co int - więc nie powinno być problemu (NOTE na końcu). Zapewne jest zdefiniowany jako int w nagłówkach - gacmen sprawdź to sobie. Pewnie jak zrzutujesz na socklen_t *, to warning nie będzie więcej wyświetlany.

'naruszenia ochrony pamieci' na 99% jest spowodowane wyjściem poza zaalokowaną tablicę - tak jak zauważył xis.
oprócz for'a jeździsz sobnie po nieswojej pamięci również printf'em/sprintf'em, nie kończysz odczytanej zawartości zerem, możesz wyjść DALEKO poza bufor:

ja bym to zaimplementował tak:

int odczytano = read(new_sock,buf,sizeof(buf)-1);
buf[odczytano] = '0';
int i=0;
while (buf=toupper(buf) i++;

printf("Wyslalem do klienta: %s",buf);
sprintf(bux,"%s",buf);


jeszcze jedna uwaga - &clnt_adr i &serv_adr są typu struct sockaddr* i rzutowanie ich nie ma najmniejszego sensu (wywołania bind i accept)


EDIT: Sprawdź, czy nie ma błędu z read()

voice

  • Gość
[C] klient serwer - problem z warningiem
« Odpowiedź #5 dnia: 2007-01-24, 17:42:54 »
 > jeszcze jedna uwaga - &clnt_adr i &serv_adr są typu struct sockaddr* i rzutowanie ich
 > nie ma najmniejszego sensu (wywołania bind i accept)

&clnt_adr i &serv_adr sa typu (struct sockaddr_in *), wiec rzutowanie do (struct sockaddr *) jest jak najberdziej poprawne

chmooreck

  • Gość
[C] klient serwer - problem z warningiem
« Odpowiedź #6 dnia: 2007-01-24, 18:14:38 »
2007-01-24 17:42:54 voice napisał:

 > &clnt_adr i &serv_adr sa typu (struct sockaddr_in *), wiec rzutowanie do (struct
 > sockaddr *) jest jak najberdziej poprawne

aaa.. faktycznie.. sorry ;-)