Explain with a Connection-Oriented Example - listen(), accept()?

Answer

/* Generic program structure for establishing
connection-oriented client-server environment.
*/

/* server program */

#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>

#include <sys/socket.h>

struct sockaddr myname;
char buf[80];

main()
{
int sock, new_sd, adrlen, cnt;

sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
printf("server socket failure %dn", errno);
perror("server: ");
exit(1);
}

myname.sa_family = AF_UNIX;
strcpy(myname.sa_data, "/tmp/billb");
adrlen = strlen(myname.sa_data) +
sizeof(myname.sa_family);

unlink("/tmp/billb"); /* defensive programming */
if (bind(sock, &myname, adrlen) < 0) {
printf("server bind failure %dn", errno);
perror("server: ");
exit(1);
}

if (listen(sock, 5) < 0 {
printf("server listen failure %dn", errno);
perror("server: ");
exit(1);
}

/* Ignore child process termination. */

signal (SIGCHLD, SIG_IGN);

/* Place the server in an infinite loop, waiting
on connection requests to come from clients.
In practice, there would need to be a clean
way to terminate this process, but for now it
will simply stay resident until terminated by
the starting terminal or the super-user. */

while (1) {
if (new_sd = accept(sock,
&myname, &adrlen)) < 0 {
printf("server accept failure %dn", errno);
perror("server: ");
exit(1);
}

/* Create child server process. Parent does no
further processing -- it loops back to wait
for another connection request. */

printf("Socket address in server %d is %x, %sn",
getpid(), myname.sa_data, myname.sa_data);

if (fork() == 0) { /* child process */
close (sock); /* child does not need it */
/* . . . . . */

cnt = read(new_sd, buf, strlen(buf));
printf ("Server with pid %d got message %sn",
getpid(), buf);
strcpy (buf, "Message to client");
cnt = write(new_sd, buf, strlen(buf));
printf("Socket address in server %d is %x, %sn",
getpid(), myname.sa_data, myname.sa_data);

/* . . . . . */
close (new_sd); /* close prior to exiting */
exit(0);
} /* closing bracket for if (fork() ... ) */

} /* closing bracket for while (1) ... ) */

} /* closing bracket for main procedure */

/* client program */

#include <stdio.h>

#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>

char buf[80];
struct sockaddr myname;

main()
{
int sock, adrlen, cnt;

sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
printf("client socket failure %dn", errno);
perror("client: ");
exit(1);
}

myname.sa_family = AF_UNIX;
strcpy(myname.sa_data, "/tmp/billb");
adrlen = strlen(myname.sa_data) +
sizeof(myname.sa_family);

if (connect( sock, &myname, adrlen) < 0) {
printf("client connect failure %dn", errno);
perror("client: ");
exit(1);
}
/* . . . . . */

strcpy(buf, "Message sent to server");
cnt = write(sock, buf, strlen(buf));
cnt = read(sock, buf, strlen(buf));
printf("Client with pid %d got message %sn",
getpid(), buf);
printf("Socket address in server %d is %x, %sn",
getpid(), myname.sa_data, myname.sa_data);

/* . . . . . */
exit(0);

All sockets Questions

Ask your interview questions on sockets

Write Your comment or Questions if you want the answers on sockets from sockets Experts
Name* :
Email Id* :
Mob no* :
Question
Or
Comment* :
 





Disclimer: PCDS.CO.IN not responsible for any content, information, data or any feature of website. If you are using this website then its your own responsibility to understand the content of the website

--------- Tutorials ---