NPC 04
NPC 04
abstract
Socket function
connect function
bind function
listen function
accept function
fork and exec function
concurrent server
close function
getsockname and getpeername function
Socket function
#include <sys/socket.h>
int socket(int family, int type, int protocol);
returns:nonnegative descriptor if OK, -1 on error
==>Normaly the protocol argument to the socket function is set to 0 exept
for raw socket.
Connect function
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr,
socklen_t addrlen);
Returns:0 if OK, -1 on error
==>this function used by a TCP client
Connect function
Return error
ETIMEOUT : no response from server
RST : server process is not running
EHOSTUNREACH : clients SYN unreachable
from some intermediate router.
bind function
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr *myaddr,
socklen_t addrlen);
Returns: 0 if OK, -1 on error
to a socket.
listen function
#include <sys/socket.h>
int listen(int sockfd, int backlog);
Returns:0 if OK, -1 on error
accept function
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr,
socklen_t *addrlen);
Returns:nonnegative descriptor if OK, -1 on error
#include
"unp.h"
#include
<time.h>
int main(int argc, char **argv)
{
int
socklen_t
struct sockaddr_in
char
time_t
listenfd, connfd;
len;
servaddr, cliaddr;
buff[MAXLINE];
ticks;
len = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
printf("connection from %s, port %d\n",
Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
ntohs(cliaddr.sin_port));
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
Write(connfd, buff, strlen(buff));
Close(connfd);
}
}
==>DayTime server that print client IP address and port.
#include <unistd.h>
int execl(const char *pathname, const char *arg(), /*(char *) 0*/);
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg());
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg());
int execvp(const char *filename, char *const argv[]);
All six return: -1 on error, no return on success
Concurrent server
pid_t pid
int listenfd, connfd;
listenfd = Socket(...);
//fill in sockaddr_in{} with servers well-known port
Bind(listenfd, LISTENQ);
for(;;){
connfd = Accept(listenfd, ...);
doit(connfd);
//process the request
Close();
//done with this client
exit(0);
//child terminate
} Close(connfd);
// parent close connected socket
}
Figure 4.13 Outline for typical concurrent server
Close function
#include <unistd.h>
int close(int sockfd);
returns:0 if OK, -1 on error
#include "unp.h"
int sockfd_to_family(int sockfd)
{
union {
struct sockaddr sa;
char
} un;
socklen_t
len;
data[MAXSOCKADDR];
len = MAXSOCKADDR;
if (getsockname(sockfd, (SA *) un.data, &len) < 0)
return(-1);
return(un.sa.sa_family);
}