sockets - How to read and write tar file in C? -


i want read tar file , write tar file using c. procedure m following here :

  1. creating tar file of folder
  2. writing client socket program reading tar file binary file in c using fread function
  3. writing whatever comes in buffer socket
  4. writing server socket program receive sent data buffer
  5. writing received buffer tar file.
  6. closing files , socket.

here code :

server.c

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h>  #define max 1024 #define sock_path "/tmp/foo"  int s, s2, t, len; struct sockaddr_un local, remote;  void createssocket() {     if ((s = socket(af_unix, sock_stream, 0)) == -1)      {         perror("socket");         exit(1);     }     printf("\nserver socket created..."); }  void setssocketpath() {     local.sun_family = af_unix;     strcpy(local.sun_path, sock_path);     unlink(local.sun_path);     len = strlen(local.sun_path) + sizeof(local.sun_family);     printf("\nserver socket path set..."); }  void bindsocket() {     if (bind(s, (struct sockaddr *)&local, len) == -1)      {         perror("bind");         exit(1);     }     printf("\nsocket binded..."); }  void listensocket() {        if (listen(s, 5) == -1)      {         perror("listen");         exit(1);     }     printf("\nlistening socket..."); }  void acceptconnection() {     printf("\nwaiting connection...");     t = sizeof(remote);     if ((s2 = accept(s, (struct sockaddr *)&remote, &t)) == -1)      {         perror("accept");         exit(1);     }     printf("\nserver socket connected..."); }  void closessocket() {     close(s);     close(s2);     printf("\nserver socket closed..."); }   void receivetar() {     int len,ret;     char buf[max] = {0};     char path[max] = "/home/priyanka/codes/3455.tgz";     file* fp;     fp = fopen(path,"wb");      while((len = recv(s2,buf,max,0)) > 0)     {         buf[len] = 0;         printf("\nreceived : %d",len);         //fputs(buf,fp);         //printf("%s",buf);         ret = fwrite(buf,1,strlen(buf),fp);         if(ret == -1)         {             perror("error writing file");         }         printf("    write : %d",ret);     }     fclose(fp); }  int main() {     createssocket();         setssocketpath();     bindsocket();     listensocket();     acceptconnection();       receivetar();      closessocket();     return 0;    } 

output of server program :

server socket created...
server socket path set...
socket binded...
listening socket...
waiting connection...
server socket connected...
received : 1024 write : 1024
received : 459 write : 459
received : 239 write : 239
received : 529 write : 529
received : 425 write : 425
received : 411 write : 411
received : 493 write : 493
received : 142 write : 142
received : 1024 write : 1024
received : 397 write : 397
received : 41 write : 41
received : 158 write : 158
received : 1024 write : 1024
received : 705 write : 705
received : 505 write : 505
received : 1024 write : 1024
received : 87 write : 87
received : 1024 write : 1024
received : 326 write : 326
received : 234 write : 234
received : 311 write : 311
received : 819 write : 819
received : 571 write : 571
received : 1024 write : 1024
received : 1024 write : 1024
received : 341 write : 341
received : 243 write : 243
received : 630 write : 630
received : 50 write : 50
received : 35 write : 35
received : 215 write : 215
server socket closed...

client.c

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h>  #define max 1024 #define sock_path "/tmp/foo"   int s, t, len; struct sockaddr_un remote;  void createcsocket() {     if ((s = socket(af_unix, sock_stream, 0)) == -1)      {         perror("socket");         exit(1);     }     printf("\nclient socket created..."); }  void setcsocketpath() {     remote.sun_family = af_unix;     strcpy(remote.sun_path, sock_path);     len = strlen(remote.sun_path) + sizeof(remote.sun_family);     printf("\nclient socket path set..."); }  void connectsocket() {     printf("\ntrying connect...");     if (connect(s, (struct sockaddr *)&remote, len) == -1)      {         perror("connect");         exit(1);     }     printf("\nclient connected...\n"); }  void closecsocket() {     close(s);     printf("\nclient socket closed..."); }  void sendtar() {     file *fp;     int ret,len;     char buf[max] = {0};     fp = fopen("/home/priyanka/3455.tgz","rb");     while(len = fread(buf,1,1024,fp))     //while((buf[0] = fgetc(fp)) != eof)     {         printf("\nread : %d",len);         ret = send(s,buf,strlen(buf),0);         printf("    sent : %d",ret);         if(ret == -1)         {             perror("error sending data : client");         }     }     fclose(fp); }  int main() {     createcsocket();     setcsocketpath();     connectsocket();      sendtar();      closecsocket();      return 0; } 

output of client program :

client socket created...
client socket path set...
trying connect...
client connected...

read : 1024 sent : 3
read : 1024 sent : 1027
read : 1024 sent : 273
read : 1024 sent : 180
read : 1024 sent : 239
read : 1024 sent : 529
read : 1024 sent : 425
read : 1024 sent : 411
read : 1024 sent : 493
read : 1024 sent : 142
read : 1024 sent : 1027
read : 1024 sent : 394
read : 1024 sent : 41
read : 1024 sent : 158
read : 1024 sent : 702
read : 1024 sent : 1027
read : 1024 sent : 503
read : 1024 sent : 2
read : 1024 sent : 1027
read : 1024 sent : 84
read : 1024 sent : 1027
read : 1024 sent : 323
read : 1024 sent : 234
read : 1024 sent : 311
read : 1024 sent : 819
read : 1024 sent : 571
read : 1024 sent : 1027
read : 1024 sent : 1027
read : 1024 sent : 335
read : 1024 sent : 243
read : 1024 sent : 630
read : 1024 sent : 50
read : 1024 sent : 35
read : 315 sent : 215
client socket closed...

i m facing problems :

  1. whatever m reading in client program few bytes of sent , still receive function reading max number of bytes. whereas want program read 1024 bytes, sent 1024 bytes, receive 1024 bytes , write 1024 bytes, not happening in case. sending length of buffer sort out problem??

  2. is way m using right 1 send tar file on socket or there different ways of doing it??

  3. how check if data read, sent, received , written??

you reading binary file fread , sending chunks if strings:

        ret = send(s,buf,strlen(buf),0); 

use instead send len bytes.

        ret = send(s,buf,len,0); 

similarly, server program should write len bytes received. appending '\0' may cause buffer overflow , writing strlen(buf) bytes fail write bytes received if nul byte received, case if tar file transmitted:

change logic to:

    ret = fwrite(buf,1,len,fp); 

you may want use netcat utility: man nc


Comments

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

gradle error "Cannot convert the provided notation to a File or URI" -

python - NameError: name 'subprocess' is not defined -