SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Förstasida   Anmälning   Postarkiv   Forum   Kalender   Sök
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [CPROG] bind()




"Erwin S. Andreasen" wrote:

> On Wed, 26 Jan 2000, Frederik Treue wrote:
>
> Andre har sagt at du ikke har angivet størrelse på din buffer. Her er
> nogle andre diverse kommentarer.
>
> >   if (sock_fd==-1)  // error check
> >     {
> >     cerr << "listen socket allocation error : " << endl;
> >     cerr << strerror(errno) << endl;
> >     exit(1);
> >     }
>
> Generelt ville jeg anbefale dig at lave en generel fatal-fejl rutine som
> printer noget ud (give den en vararg liste som sprintf) og ellers exit'er.
>
> Det gør din kode noget mere overskueligt, fx:
>
> if ((sock_fd = socket(...)) < 0)
>         fatal_error("listen: %m");
>
> "%m" er en GNU-extension som svarer til %s og en strerror(errno)
> automatisk overført. Altså kræver den GNU libc. Hvis du ikke vil bruge det
> af hensyn til portabilitet kunne du fx checke om det sidste tegn i
> strengen der overføres er ":" og derefter udskrive strerror(errno).
>
> fatal_error bruger så va_list, va_start og vfprintf(stderr, "....").
>
> >   bzero(&(my_addr.sin_zero), 8);
>
> Du bør bruge sizeof her -- at bruge magiske tal sådan gør programmet
> sværere at vedligholde.
>
> ``Though a program be but three lines long, someday it will have to be maintained.''
>
> (Tao of Programming ;) )
>
> >   // attempt to recv() incoming signal
> >   bytes_recv = recv(new_fd, buf, len, 0);
>
> Hvis du ikke kan har brug for de ekstra flag som recv() giver mulighed
> for, kan du bruge read().
>
> >   // end the received signal
> >   *(buf+bytes_recv) = '\0';
>
> Her kunne recv() returnere < 0 ved fejl, det bør du checke for.
>
> >   // make connection to detination, using defined socket
> >   connect(sockfd, (struct sockaddr *) &dest_addr, sizeof(sockaddr));
> >   if (errno)  // error check
>
> Du skal checke resultatet af "connect" her, ikke bare checke errno! Du har
> ikke garanti at errno er sat til 0 når det sidste kald lykkedes: du kan
> kun stole på errno når
>
> >   len = strlen(msg);  // find length of message to be send()
> >   bytes_sent = send(sockfd, msg, len, 0);  // attempt to send the message
>
> Når du skriver X bytes til en socket har du desværre ikke garanti for at
> de alle X bliver skrevet. Det er en god chance for det hvis du fx skrive
> 250 bytes og når den nu er localhost det drejer sig om, men skriver du fx
> 4k kan det være at kernen kun sender 2k af dem og så returnerer 2049 til
> dig -- og du må selv holde styr på hvor langt du er kommet.
>
> For at være sikker her kunne du fx lave din again "bwrite" rutine som
> bliver ved med at sende indtil den har fået sendt det hele afsted.
>
> --
> ==============================================================================
> Erwin Andreasen   Herlev, Denmark <sslug@sslug>          UNIX System Programmer
> <URL:http://www.andreasen.org>              <*>         (not speaking for) DDE
> ==============================================================================

Ja, der er en del at lære, men jeg er som sagt først lige gået igang med
netprogramering.
Tak for hjælpen (også til de andre)

Regards
Frederik Treue




 
Förstasida   Anmälning   Postarkiv   Översikt   Kalender   Sök

 
 
Fel och synpunkter angående webb-sidorna skickas till <www_admin>. Senaste ändring 2005-08-10, klockan 20:08
Denna sidan underholds av MHonArc .