sockets - How to read and write tar file in C? -
i want read tar file , write tar file using c. procedure m following here :
- creating tar file of folder
- writing client socket program reading tar file binary file in c using fread function
- writing whatever comes in buffer socket
- writing server socket program receive sent data buffer
- writing received buffer tar file.
- 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 :
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??
is way m using right 1 send tar file on socket or there different ways of doing it??
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
Post a Comment