InterviewSolution
| 1. |
How Do I Get The Port Number For A Given Service? |
|
Answer» Use the getservbyname() routine. This will return a pointer to a servent structure. You are interested in the s_port field, which contains the PORT number, with correct byte ordering (so you don't NEED to call htons() on it). Here is a sample routine. /* Take a service name, and a service type, and return a port number. If the service name is not found, it tries it as a decimal number. The number returned is byte ordered for the network. */ int atoport(char *service, char *proto) { int port; long int lport; STRUCT servent *serv; char *errpos; /* First try to READ it from /etc/services */ serv = getservbyname(service, proto); if (serv != NULL) port = serv->s_port; else { /* Not in services, maybe a number? */ lport = strtol(service,&errpos,0); if ( (errpos[0] != 0) || (lport < 1) || (lport > 5000) ) return -1; /* Invalid port address */ port = htons(lport); } return port; } Use the getservbyname() routine. This will return a pointer to a servent structure. You are interested in the s_port field, which contains the port number, with correct byte ordering (so you don't need to call htons() on it). Here is a sample routine. /* Take a service name, and a service type, and return a port number. If the service name is not found, it tries it as a decimal number. The number returned is byte ordered for the network. */ int atoport(char *service, char *proto) { int port; long int lport; struct servent *serv; char *errpos; /* First try to read it from /etc/services */ serv = getservbyname(service, proto); if (serv != NULL) port = serv->s_port; else { /* Not in services, maybe a number? */ lport = strtol(service,&errpos,0); if ( (errpos[0] != 0) || (lport < 1) || (lport > 5000) ) return -1; /* Invalid port address */ port = htons(lport); } return port; } |
|