Unix Network Programming
Unix Network Programming
PROGRAMMING
Submitted To:
Prof. Mohan Lal
/***********************OUTPUT*******************************/
/*****************************server.c********************************/
#include<stdio.h>
#include<sys/errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define MAXBUFF 1024
server(readfd,writefd)
int readfd;
int writefd;
{
char buff[MAXBUFF];
char errmesg[256],*sys_err_str();
int n,fd;
extern int errno;
if((n=read(readfd,buff,MAXBUFF))<=0)
perror("Server:filename read error");
buff[n]='\0';
if((fd=open(buff,0))<0){
sprintf(errmesg,":can't open , %s\n","file");
strcat(buff,errmesg);
n=strlen(buff);
if(write(writefd,buff,n)!=n)
perror("Server:mesg write error");
}else {
while((n=read(fd,buff,MAXBUFF))>0)
if(write(writefd,buff,n)!=n)
perror("Server:data write error");
if(n<0) perror("Server:data read error");
}
}
/***************************client.c**************************/
#include<stdio.h>
#include<sys/errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define MAXBUFF 1024
client(readfd,writefd)
int readfd;
int writefd;
{
char buff[MAXBUFF];
int n;
printf("Please enter the file name::");
if(fgets(buff,MAXBUFF,stdin)==NULL)
/**************************pipe.c******************************/
#include<stdio.h>
#include<sys/errno.h>
#include<unistd.h>
#include<stdlib.h>
#include"client.c"
#include"server.c"
main()
{
int childpid,pipe1[2],pipe2[2];
if((pipe(pipe1)<0)||(pipe(pipe2)<0))
perror("can't create pipes");
if((childpid=fork())<0){
perror("can't fork");
}
else if(childpid>0){
/*parent*/
close(pipe1[0]);
close(pipe2[1]);
client(pipe2[0],pipe1[1]);
while(wait((int *)0)!= childpid) /*wait for child*/
close(pipe1[1]);
close(pipe2[0]);
exit(0);
}
else
{
close(pipe1[1]);
close(pipe2[0]);
server(pipe1[0],pipe2[1]);
close(pipe1[0]);
close(pipe2[1]);
exit(0);
}
}
OUTPUT:
/**************************servermain.c******************/
#include "fifo.h"
#include "server.c"
main(int argc, char **argv)
{
int readfd, writefd;
/* create two FIFOs; OK if they already exist */
if ((mknod(FIFO1, S_IFIFO|PERMS,0) < 0) && (errno != EEXIST))
printf("can't create %s", FIFO1);
if ((mknod(FIFO2, S_IFIFO|PERMS,0) < 0) && (errno != EEXIST))
{ unlink(FIFO1);
printf("can't create %s", FIFO2);
}
readfd = open(FIFO1, 0);
writefd = open(FIFO2,1);
server(readfd, writefd);
close(readfd);
close(writefd);
exit(0); }
/*************************clientmain.c********************/
#include "fifo.h"
#include "client.c"
int main(int argc, char **argv)
{
int readfd, writefd;
if((writefd = open(FIFO1,1))<0)
perror(client :cant open write fifo: %s ,FIFO1);
if((readfd = open(FIFO2,0))<0)
perror(client :cant open read fifo: %s ,FIFO2);
client(readfd, writefd);
close(readfd);
close(writefd);
if( unlink(FIFO1)<0)
perror(client :cant unlink fifo: %s ,FIFO1);
if(unlink(FIFO2)<0)
perror(client :cant unlink fifo: %s ,FIFO2);
exit(0);
}
OUTPUT:
/***************************mesgq.h******************/
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
#include<sys/errno.h>
#include<stdio.h>
#include<unistd.h>
#include "mesg.h"
extern int errno;
#define MKEY1 1234L
#define MKEY2 2345L
#define PERMS 0666
/**********************send_recv_fun.c*******************/
#include "mesgq.h"
mesg_recv(int id,Mesg *mesgptr)
{
int n;
n=msgrcv(id,(char *)&(mesgptr->mesg_type),MAXMESGDATA,mesgptr>mesg_type,0);
if((mesgptr->mesg_len=n)<0)
perror("msgrcv error");
return n;
}
mesg_send(int id,Mesg * mesgptr)
{
if(msgsnd(id,(char*)&(mesgptr->mesg_type),mesgptr->mesg_len,0)!=0)
perror("mesg send error");
}
/**************************server.c**********************/
#include "send_recv_fun.c"
Mesg mesg;
extern int errno;
server(int ipcreadfd,int ipcwritefd)
{
char errmesg[256];
int n,filefd;
mesg.mesg_type=1L;
if((n=mesg_recv(ipcreadfd,&mesg))<=0)
perror("server:filename read error");
mesg.mesg_data[n]='\0';
if((filefd=open(mesg.mesg_data,0))<0)
{
sprintf(errmesg,":can't open,%s\n","file");
strcat(mesg.mesg_data,errmesg);
mesg.mesg_len=strlen(mesg.mesg_data);
mesg_send(ipcwritefd,&mesg);
}
else
{
while( (n=read(filefd,mesg.mesg_data,MAXMESGDATA))>0)
mesg.mesg_len=n;
mesg_send(ipcwritefd,&mesg);
}
close(filefd);
if(n<0)
perror("server:read error");
mesg.mesg_len=0;
mesg_send(ipcwritefd,&mesg);
}
/***************************servermain.c******************************/
#include "server.c"
main()
{
int readid,writeid;
if((readid=msgget(MKEY1,PERMS|IPC_CREAT))<0)
perror("Server: can't get message queue 1");
if((writeid=msgget(MKEY2,PERMS|IPC_CREAT))<0)
perror("Server: can't get message queue 2");
server(readid,writeid);
exit(0);
/*********************************client.c*************************/
#include "send_recv_fun.c"
Mesg mesg;
client( int ipcreadfd, int ipcwritefd)
{
int n;
printf("Please enter the file name::");
if(fgets(mesg.mesg_data,MAXMESGDATA,stdin)==NULL)
perror("filename read error");
n=strlen(mesg.mesg_data);
if(mesg.mesg_data[n-1]=='\n')
n--;
mesg.mesg_len=n;
mesg.mesg_type=1L;
mesg_send(ipcwritefd,&mesg);
printf("Here is the content of the file::\n\n");
while((n=mesg_recv(ipcreadfd,&mesg))>0)
if(write(1,mesg.mesg_data,n)!=n)
perror("client:data write errors");
if(n<0)
perror("data read error");
/*******************************clientmain.c*************************/
#include "client.c"
main()
{
int readid,writeid;
if((writeid=msgget(MKEY1,0))<0)
perror("Client: can't get message queue 1");
if((readid=msgget(MKEY2,0))<0)
perror("Client: can't get message queue 2");
client(readid,writeid);
if(msgctl(readid,IPC_RMID,(struct msqid_ds *)0)<0)
perror("client: RMID mesg queue 1");
if(msgctl(writeid,IPC_RMID,(struct msqid_ds *)0)<0)
perror("client: RMID mesg queue 2");
exit(0);
}
/*************************OUTPUT***************************/
char errmesg[256];
int n,filefd;
mesg.mesg_type=1L;
if((n=mesg_recv(id,&mesg))<=0)
printf("server:filename read error");
mesg.mesg_data[n]='\0';
mesg.mesg_type=2L;
if((filefd=open(mesg.mesg_data,0))<0)
{
sprintf(errmesg,":can't open,%s\n","file");
strcat(mesg.mesg_data,errmesg);
mesg.mesg_len=strlen(mesg.mesg_data);
mesg_send(id,&mesg);
}
else
{
while( (n=read(filefd,mesg.mesg_data,MAXMESGDATA))>0)
mesg.mesg_len=n;
mesg_send(id,&mesg);
}
close(filefd);
if(n<0)
printf("server read error");
mesg.mesg_len=0;
mesg_send(id,&mesg);
}
/*****************************client.c*****************************/
#include "send_recv_fun.c"
Mesg mesg;
main()
{
int id;
if((id=msgget(MKEY1,0))<0)
perror("CLIENT:can't msgget message queue 1");
client(id);
if(msgctl(id,IPC_RMID,(struct msqid_ds *) 0)<0)
perror("client:cant RMID message queue 1");
exit(0);
}
/*client function */
client( int id)
{
int n;
printf("Please give a file name to read it::");
if(fgets(mesg.mesg_data,MAXMESGDATA,stdin)==NULL)
printf("filename read error");
n=strlen(mesg.mesg_data);
if(mesg.mesg_data[n-1]=='\n')
n--;
mesg.mesg_len=n;
mesg.mesg_type=1L;
mesg_send(id,&mesg);
printf("Here is the file content::\n\n");
mesg.mesg_type=2L;
while((n=mesg_recv(id,&mesg))>0)
if(write(1,mesg.mesg_data,n)!=n)
perror("client:data write errors");
if(n<0)
perror("data read error");
}
/**************************OUTPUT**************************/
Socket programming
/**********************util_routines.c*************************/
/*readn function*/
int
readn(fd,ptr,nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
int nleft,nread;
nleft=nbytes;
while(nleft>0)
{
nread=read(fd,ptr,nleft);
if(nread<0) return nread;
else if(nread ==0)
break;
nleft-=nread;
ptr+=nread;
}
return(nbytes-nleft);
}
/*writen function */
int
writen(fd,ptr,nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
int nleft,nwrite;
nleft=nbytes;
while(nleft>0)
{
nwrite=write(fd,ptr,nleft);
if(nwrite<=0) return nwrite;
nleft-=nwrite;
ptr+=nwrite;
}
return(nbytes-nleft);
}
/*readline function*/
int
readline(fd,ptr,maxlen)
register int fd;
register char *ptr;
register int maxlen;
{
int n,rc;
char c;
for(n=1;n<maxlen;n++){
if ((rc=read(fd,&c,1))==1){
*ptr++=c;
if(c=='\n')
break;
}else if(rc==0){
if(n==1)return 0;
else break;
}else return (-1);
}
*ptr=0;
return n;
}
/****************************str_echo.c************************/
#include <stdio.h>
#include<string.h>
#define MAXLINE 512
str_echo( int sockfd)
{
char line[MAXLINE];
int n;
for(;;){
n=readline(sockfd,line,MAXLINE);
if(n==0)
return;
else if(n<0)
/****************************str_cli.c**************************/
#include <stdio.h>
#include<string.h>
#define MAXLINE 512
str_cli(FILE *fp, int sockfd)
{
char sendline[MAXLINE], recvline[MAXLINE+1];
int n;
printf("Client:");
while (fgets(sendline, MAXLINE, fp) != NULL) {
n=strlen(sendline);
if(writen(sockfd,sendline,n)!=n)
perror("str_cli:writen error on socket");
printf("Server:");
printf("Client:");
if (n=(readline(sockfd, recvline, MAXLINE)) < 0)
perror("str_cli: readline error");
recvline[n]=0;
fputs(recvline, stdout);
}
if(ferror(fp))
perror("str_cli:error reading file");
}
/***********************************dg_echo.c**************************/
#include<sys/types.h>
#include<sys/socket.h>
#define MAXLINE 512
dg_echo(sockfd,pcli_addr,maxclilen)
int sockfd;
if(sendto(sockfd,mesg,n,0,pcli_addr,clilen)!=n)
printf("dg:echo:sendto error");
}
/*****************************dg_cli.c**********************************/
#include<sys/types.h>
#include<sys/socket.h>
#define MAXLINE 512
dg_cli(FILE *fp, int sockfd,struct sockaddr * pserv_addr,int servlen)
{
char sendline[MAXLINE], recvline[MAXLINE+1];
int n;
printf("Client:");
while (fgets(sendline, MAXLINE, fp) != NULL) {
n=strlen(sendline);
if(sendto(sockfd,sendline,n,0,pserv_addr,servlen)!=n)
printf("dg_cli:writen error on socket");
if (n=(recvfrom(sockfd, recvline, MAXLINE,0,(struct sockaddr *)0,(int
*)0)) < 0)
printf("dg_cli: readline error");
recvline[n]=0;
printf("Server:");
fputs(recvline, stdout);
printf("Client:");
}
if(ferror(fp))
printf("dg_cli:error reading file");
/********************************inet.h****************************/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include "util_routines.c"
#include "str_echo.c"
#include "str_cli.c"
#include "dg_echo.c"
#include "dg_cli.c"
#define SERV_UDP_PORT 7000
#define SERV_TCP_PORT 6000
#define SERV_HOST_ADDR "127.0.0.1"
char *pname;
/********************************unix.h*******************************/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<sys/un.h>
#include<unistd.h>
#include "util_routines.c"
#include "str_echo.c"
#include "str_cli.c"
#include "dg_echo.c"
#include "dg_cli.c"
#define UNIXSTR_PATH "./unixstr"
#define UNIXDG_PATH "./unixdg"
#define UNIXDG_TMP "/tmp/dg.abcdef"
char *pname;
}
}
else if(childpid==0)
{
close(sockfd);
str_echo( newsockfd);
exit(0);
}
close(newsockfd);
/****************************tcp_client.c****************************/
#include "inet.h"
int
main(argc, argv)
int argc;
char *argv[];
{
int sockfd;
struct sockaddr_in serv_addr;
pname=argv[0];
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(SERV_HOST_ADDR);
serv_addr.sin_port = htons(SERV_TCP_PORT);
if((sockfd = socket(AF_INET, SOCK_STREAM,0))<0)
printf("client: can't open socket stream");
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
printf("client: can't connect to server");
str_cli(stdin, sockfd);
exit(0);
}
/******************************OUTPUT******************************/
/*************************OUTPUT****************************/
int sockfd,newsockfd,clilen,childpid,servlen;
struct sockaddr_un serv_addr,cli_addr;
pname=argv[0];
if((sockfd = socket(AF_UNIX, SOCK_STREAM,0))<0)
perror("server: can't open socket stream");
unlink(UNIXSTR_PATH);
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,UNIXSTR_PATH);
servlen=strlen(serv_addr.sun_path)+sizeof(serv_addr.sun_family);
if(bind(sockfd,(struct sockaddr *)&serv_addr,servlen)<0)
perror("server: can't bind address");
listen(sockfd,5);
for(;;){
clilen=sizeof(cli_addr);
newsockfd=accept(sockfd,(struct sockaddr *)&cli_addr,&clilen);
if(newsockfd<0)
perror("server: accept error");
if((childpid=fork())<0)
perror("server: fork error");
else if(childpid==0)
{
close(sockfd);
str_echo( newsockfd);
exit(0);
}
close(newsockfd);
}
}
/**************************unix_tcp_client***************************/
#include "unix.h"
int
main(argc, argv)
int argc;
char *argv[];
{
int sockfd,servlen;
struct sockaddr_un serv_addr;
pname=argv[0];
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,UNIXSTR_PATH);
servlen=strlen(serv_addr.sun_path)+sizeof(serv_addr.sun_family);
if((sockfd = socket(AF_UNIX, SOCK_STREAM,0))<0)
perror("client: can't open socket stream");
if(connect(sockfd,(struct sockaddr *)&serv_addr,servlen)<0)
perror("client: can't connect to server");
str_cli(stdin, sockfd);
close(sockfd);
exit(0);
}
/******************************OUTPUT*****************************/
strcpy(serv_addr.sun_path,UNIXDG_PATH);
servlen=strlen(serv_addr.sun_path)+sizeof(serv_addr.sun_family);
if(bind(sockfd,(struct sockaddr *)&serv_addr,servlen)<0)
perror("server: can't bind address");
dg_echo( sockfd,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
exit(0);
}
/****************************unix_udp_client**********************/
#include "unix.h"
int
main(argc, argv)
int argc;
char *argv[];
{
int sockfd,clilen,servlen;
char *mktemp();
struct sockaddr_un serv_addr,cli_addr;
pname=argv[0];
unlink(UNIXSTR_PATH);
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path,UNIXDG_PATH);
servlen=strlen(serv_addr.sun_path)+sizeof(serv_addr.sun_family);
if((sockfd = socket(AF_UNIX, SOCK_DGRAM,0))<0)
perror("client: can't open socket data gram");
bzero((char *)&cli_addr, sizeof(cli_addr));
cli_addr.sun_family = AF_UNIX;
strcpy(cli_addr.sun_path,UNIXDG_TMP);
mktemp(cli_addr.sun_path);
clilen=strlen(cli_addr.sun_path)+sizeof(cli_addr.sun_family);
if(bind(sockfd,(struct sockaddr *)&cli_addr,clilen)<0)
perror("client: can't bind address");
/*****************************OUTPUT***********************/
THANK YOU