ptfserver.c full code network programming

Special Thanks to:
Danu Kurniawan n Even

#define SERVER_PORT_ID 6081
#define CLIENT_PORT_ID 6086
#define SERVER_HOST_ADDR “127.0.0.1″ //IP localhost, atau ip dari komputer yang bisa dibind

#define MAXSIZE 512
#define ACK 2
#define NACK 3
#define REQUESTFILE 100
#define COMMANDNOTSUPPORTED 150
#define COMMANDSUPPORTED 160
#define BADFILENAME 200
#define FILENAMEOK 400
#define STARTTRANSFER 500

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <errno.h>

#define MY_PORT_ID 6081
#define MAXLINE 256
#define MAXSIZE 512

#define ACK 2
#define NACK 3
#define REQUESTFILE 100
#define COMMANDNOTSUPPORTED 150
#define COMMANDSUPPORTED 160
#define BADFILENAME 200
#define FILENAMEOK 400

int writen(int sd,char *ptr,int size);
int readn(int sd,char *ptr,int size);
int len;

main(){
int sockid, newsd, pid, clilen;
struct sockaddr_in my_addr, client_addr;

printf(”server: creating socket\n”);
sockid = socket(AF_INET,SOCK_STREAM,0);

if(sockid < 0){
printf("socket error: %d\n", errno);
exit(0);
}

printf("binding my local socket\n");
bzero((char *) &my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MY_PORT_ID);
my_addr.sin_addr.s_addr=inet_addr(SERVER_HOST_ADDR); //menset IP sesuai SERVER_HOST_ADDR agar client bisa connect

if(bind(sockid ,(struct sockaddr *) &my_addr,sizeof(my_addr)) < 0){
perror("bind error...");
printf("bind error:%d\n", errno);
exit(0);
}

printf("server: starting listen \n");
if(listen(sockid,5) < 0){
printf("listen error :%d\n",errno);
exit(0);
}

while(1){
printf("server: starting accept\n");

if((newsd=accept(sockid,(struct sockaddr*) &client_addr,&clilen))<0){
printf("accept error:%d\n", errno);
exit(0);
}

doftp(newsd);
}
}

doftp(int newsd){
int i,fsize,fd,msg_ok,fail;
int fail1,req,c,ack;
int no_read ,num_blks;
int num_blks1,num_last_blk;
int num_last_blk1,tmp;
char fname[MAXLINE];
char out_buf[MAXSIZE];
FILE *fp;

no_read = 0;
num_blks = 0;
num_last_blk = 0;
req = 0;

if((readn(newsd,(char *)&req,sizeof(req))) < 0){
printf("read error %d\n",errno);
exit(0);
}

req = ntohs(req);
printf("client request code is: %d\n",req);

if(req!=REQUESTFILE){
printf("unsupported operation. goodbye\n");
msg_ok = COMMANDNOTSUPPORTED;
msg_ok = htons(msg_ok);

if((writen(newsd,(char *)&msg_ok,sizeof(msg_ok)))<0){
printf("write error :%d\n",errno);
exit(0);
}

exit(0);
}

msg_ok = COMMANDSUPPORTED;
msg_ok = htons(msg_ok);

if((writen(newsd,(char *) &msg_ok,sizeof(msg_ok))) < 0){
printf("write error :%d\n",errno);
exit(0);
}

fail = FILENAMEOK;

if((len=read(newsd,fname,MAXLINE)) < 0) {
printf("filename read error :%d\n",errno);
fail = BADFILENAME ;
}

fname[len]='\0';

if((fp=fopen(fname,"r"))==NULL)fail= BADFILENAME;
tmp = htons(fail);

if((writen(newsd,(char *)&tmp,sizeof(tmp))) < 0){
printf("write error :%d\n",errno);exit(0);
}

if(fail==BADFILENAME){
printf("server cant open file\n");
close(newsd);
exit(0);
}

printf("filename is %s\n",fname);
req = 0;

if((readn(newsd,(char *)&req,sizeof(req)))<0){
printf("read error :%d\n",errno);
exit(0);
}

printf("start transfer,%d, received\n",ntohs(req));
printf("starting transfer\n");
fsize = 0;ack = 0;

while((c=getc(fp))!=EOF) fsize++;

num_blks = fsize / MAXSIZE;
num_blks1 = htons(num_blks);
num_last_blk = fsize % MAXSIZE;
num_last_blk1 = htons(num_last_blk);

if((writen(newsd,(char *)&num_blks1, sizeof(num_blks1)))< 0){
printf("write error :%d\n",errno);
exit(0);
}

printf("told client there are %d blocks\n", num_blks);

if((readn(newsd,(char *)&ack,sizeof(ack))) < 0){
printf("ack read error :%d\n",errno);
exit(0);
}

if(ntohs(ack) != ACK){
printf("ACK not received on file size\n");
exit(0);
}

if((writen(newsd,(char *)&num_last_blk1, sizeof(num_last_blk1))) < 0){
printf("write error :%d\n",errno);
exit(0);
}

printf("told client %d bytes in last block\n",num_last_blk);

if((readn(newsd,(char *)&ack,sizeof(ack))) < 0){
printf("ack read error :%d\n",errno);
exit(0);
}

if(ntohs(ack) != ACK){
printf("ACK not received on file size\n");
exit(0);
}

rewind(fp);

for(i= 0; i < num_blks; i ++){
no_read = fread(out_buf,sizeof(char),MAXSIZE,fp);
if (no_read == 0){
printf("file read error\n"); exit(0);
}

if (no_read != MAXSIZE){
printf("file read error\n"); exit(0);
}

if((writen(newsd,out_buf,MAXSIZE)) < 0){
printf("error sending block:%d\n",errno);exit(0);
}

if((readn(newsd,(char *)&ack,sizeof(ack))) < 0){
printf("ack read error :%d\n",errno);exit(0);
}

if (ntohs(ack) != ACK){
printf("ACK not received for block %d\n",i);
exit(0);
}

printf("%d\r",i);
}

if(num_last_blk > 0){
printf(”%d\n”,num_blks);
no_read = fread(out_buf,sizeof(char),num_last_blk,fp);

if (no_read == 0){
printf(”server: file read error\n”);
exit(0);
}

if (no_read != num_last_blk){
printf(”file read error : no_read is less 2\n”);
exit(0);
}

if((writen(newsd,out_buf,num_last_blk)) < 0){
printf("server: file transfer error %d\n",errno);
exit(0);
}

if((readn(newsd,(char *)&ack,sizeof(ack))) < 0){
printf("server: ack read error %d\n",errno);
exit(0);
}

if(ntohs(ack) != ACK) {
printf("server: ACK not received last block\n");
exit(0);
}
}

else printf("\n");

printf("FILE TRANSFER COMPLETE on socket %d\n",newsd);
fclose(fp);
close(newsd);
}

int writen(int sd, char *ptr,int size){
int no_left, no_written;
no_left = size;

while(no_left > 0){
no_written=write(sd, ptr,no_left);

if(no_written <=0)
return(no_written);

no_left -= no_written;
ptr += no_written;
}
return(size - no_left);
}

int readn(int sd,char *ptr,int size){
int no_left,no_read;
no_left = size;

while (no_left > 0){
no_read = read(sd,ptr,no_left);

if(no_read <0)
return(no_read);
if(no_read == 0)
break;

no_left -= no_read;
ptr += no_read;
}

return(size – no_left);
}

One Response to “ptfserver.c full code network programming”

  1. Very great web.
    The content here is very valuable.

    I will tell my friends.

    Cheers

Leave a Reply