[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] bind()



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
==============================================================================




 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *