Linux socketプログラミング学習初歩(3)-クライアントがサーバにファイルを要求


サーバ側:
#include 
#include 
#include //read,write
#include 
#include 
#include 

#include 
#include //open
#include 

#define SERVER_PORT 12345
#define BUF_SIZE 4096 /* block transfer size */
#define QUEUE_SIZE 10 /* how many client can connect at the same time */

void fatal(char *string)
{
    printf("%s
",string); exit(1); } int main(/*int argc,char * argv[]*/) { int s,b,l,fd,sa,bytes,on=1; char buf[BUF_SIZE]; /*buf for outgoing files*/ struct sockaddr_in channel; /* hold IP address*/ /* Build address structure to bind to socket. */ bzero(&channel,sizeof(channel)); channel.sin_family=AF_INET; channel.sin_addr.s_addr=htonl(INADDR_ANY); channel.sin_port=htons(SERVER_PORT); /* Passive open.Wait for connection. */ s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); /* Creat socket */ if(s<0) fatal("socket failed"); setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on)); /* use the socket for many time (up word) */ b=bind(s,(struct sockaddr *)&channel,sizeof(channel)); if(b<0) fatal("blind failed"); l=listen(s,QUEUE_SIZE); if(l<0) fatal("listen failed"); /* Socket is now set up and bound. Wait for connection and process it. */ while(1) { sa=accept(s,0,0); if(sa<0) fatal("accept failed"); recv(sa,buf,BUF_SIZE,0); /* Get and return the file. */ fd=open(buf,O_RDONLY); if(fd<0) fatal("open failed"); while(1) { bytes=read(fd,buf,BUF_SIZE); if(bytes<=0) break; write(sa,buf,bytes); } close(fd); close(sa); } return 0; }

クライアント:
/*
 *This page contains a client program that can request a flie from the server program.
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include //read,write
#include 

#define SERVER_PORT 12345
#define BUF_SIZE 4096
#define PATH "/home/fupeng/Desktop/test.txt"
#define DEST_IP "127.0.0.1"

void fatal(char *s)
{
	printf("%s
",s); exit(1); } int main(/*int argc,char * *argv*/) { int c,s,bytes; char buf[BUF_SIZE]; /*buf for incoming files*/ struct sockaddr_in channel; /* hold IP address*/ // if (argc!=3)fatal("Usage:client IPaddress file-name"); s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); if(s<0)fatal("socket"); bzero(&channel,sizeof(channel)); channel.sin_family=AF_INET; channel.sin_port=htons(SERVER_PORT); if(inet_aton(DEST_IP,&channel.sin_addr)==0) { /* use the ASCII ip for the server's sin_addr. */ fprintf(stderr,"Inet_aton erro
"); exit(1); } c=connect(s,(struct sockaddr *)&channel,sizeof(channel)); if(c<0)fatal("connetct failed"); // send(s,argv[2],strlen(argv[2]),0); send(s,PATH,strlen(PATH),0);//BY FUPENG /* Go get the file and write it to standard output.*/ while(1) { bytes=read(s,buf,BUF_SIZE); if(bytes<=0) exit(0); write(1,buf,bytes); } }

クライアントがサーバからファイルを取得する例を示します.取得したファイルは、ターミナルインタフェースに直接表示されます.