One: Requirements
Using a Linux socket for file transfer, this time only supports the client side to upload files to the sever side
Two: Implementation tips:
Client.c
There are two parameters for the client, namely the server hostname and port;
Enter the name of the file you want to transfer in the while loop, and then set up a socket to connect to the server via the server hostname and port;
Open the file, read the file in the while loop, send the file
Sever.c
Accept the client's connection in the while loop, accepting the data and writing it to the file
(You can also select a connection from the Select () Accept client to receive data in a while loop and write to the file)
Three: Procedure
SEVER.C (server side)
#include <stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/inch.h>#include<sys/types.h>#include<unistd.h>#include<netdb.h>#include<sys/stat.h>#include<fcntl.h>#definePORT 5168#defineMsglen 1024intMainintargcChar**argv) { intSeverfd, CLIENTFD; intFp,flags; Socklen_t Addrlen; structsockaddr_in severaddr, clientaddr; CharRecvbuff[msglen]; Charfilename[ -]; intRecv_len; if(SEVERFD = socket (af_inet, Sock_stream,0)) == -1) {perror ("Sockst () error"); Exit (-1); } severaddr.sin_family=af_inet; Severaddr.sin_port=htons (PORT); SeverAddr.sin_addr.s_addr=htons (Inaddr_any); Bzero (&severaddr.sin_zero,8); if(Bind (SEVERFD, (structsockaddr*) &severaddr,sizeof(structSOCKADDR)) = =-1) {perror ("bind () error"); Exit (-1); } if(Listen (SEVERFD,1) == -1) {perror ("Listen () Error"); Exit (-1); } Addrlen=sizeof(structsockaddr); while(1) {Flags=0; if(Clientfd = Accept (SEVERFD, (structsockaddr*) &clientaddr, &addrlen)) = =-1) {perror ("Accept () error"); Exit (-1); } printf ("recv file Fome ip:%s port:%d\n", Inet_ntoa (CLIENTADDR.SIN_ADDR), Ntohs (Clientaddr.sin_port)); if(recv (CLIENTFD, filename, strlen (filename),0) <0) {perror ("recv filename Error"); Break;// Less} FP= open (filename, O_RDWR | O_creat,777); while(Recv_len = recv (Clientfd, Recvbuff, Msglen,0)) >0) {Flags++; if(Flags = =1) {printf ("recv file Start"); } Else{printf ("."); } if(Write (FP, Recvbuff, Recv_len)) {bzero (&Recvbuff, Msglen); }Else{perror ("write () error"); Break; } } if(Flags = =0) perror ("recv () error"); if(Flags >0) {printf ("\nrecv success\n"); Close (CLIENTFD); }} close (SEVERFD); return 0;}
CLIENT.C (client)
#include <stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/inch.h>#include<sys/types.h>#include<unistd.h>#include<netdb.h>#include<sys/stat.h>#include<fcntl.h>#defineMsglen 1024structADDR {intPort; Charname[ +];};voidFile_send (structADDR ADDR,Char*filename) { intSOCKFD; FILE*FP; structsockaddr_in sevraddr; structHostent *host; CharReadbuff[msglen]; intLen; Host=gethostbyname (addr.name); if(SOCKFD = socket (af_inet, Sock_stream,0)) == -1) {perror ("socket () error"); Exit (-1); }Elseprintf ("Socket ok\n"); Sevraddr.sin_family=af_inet; Sevraddr.sin_port=htons (Addr.port); Sevraddr.sin_addr= *((structin_addr*) host->h_addr); Bzero (&sevraddr.sin_zero,8);//printf ("ok2\n"); if(Connect (SOCKFD,structsockaddr*) &sevraddr,sizeof(structSOCKADDR)) = =-1) {perror ("Connect () Error"); Exit (-1); }Elseprintf ("Connect ok\n");//fp = open (filename, o_rdonly); if(Send (SOCKFD, filename,sizeof(filename),0) <0) {perror ("Send filename Error"); Exit (-1); } FP= fopen (filename,"RB"); if(FP! =NULL) {printf ("Send File"); while(1) { if(len = fread (Readbuff,1, Msglen, FP)) >0) { if(Send (SOCKFD, Readbuff, Len,0) <0) {perror ("Send () error"); Exit (-1); } Else{printf ("."); Bzero (&Readbuff, Msglen); } } Else if(len = =0){//equals 0 means the file has reached the end//Send (SOCKFD, Readbuff, strlen (Readbuff), 0);printf"\nfile Send success\n"); Break; } Else{perror ("read () Error"); Exit (-1); } } }Else{printf ("Open File failed\n"); Exit (-1); } fclose (FP); Close (SOCKFD);}intMainintargcChar**argv) { structADDR useraddr; Charfilename[ -]; if(ARGC! =3) {printf ("Usage:./client [hostname] [port]"); Exit (-1); } strcpy (Useraddr.name, argv[1]); Useraddr.port= Atoi (argv[2]); while(1) {printf ("Please input filename of want send\n"); Fgets (filename, -, stdin); Filename[strlen (filename)-1] =0;//printf ("ok1\n");file_send (useraddr, filename); } return 0;}
Four: Phenomenon
(Has been experimented, running correctly)
Linux------Small Network disk (1)