通过Linux socket读取Linux服务器上的文件

从Linux客户机上读取另一台Linux服务器上指定目录下的文件,服务器端代码和客户端代码实现如下:

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

#define SERVER_PORT 20000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 255
#define LINE_LEN 60  // in the file, define one line's length
#define WELCOME_MESSAGE "welcome to connect the server. "

int main(int argc, char **argv)
{
 int servfd,clifd;
 char s[LINE_LEN];
 struct sockaddr_in servaddr,cliaddr;

 if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
  printf("create socket error!\n");
  exit(1);
 }

 bzero(&servaddr,sizeof(servaddr));
 servaddr.sin_family = AF_INET;
 servaddr.sin_port = htons(SERVER_PORT);
 servaddr.sin_addr.s_addr = htons(INADDR_ANY);

 if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
  printf("bind to port %d failure!\n",SERVER_PORT);
  exit(1);
 }

 if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0){
  printf("call listen failure!\n");
  exit(1);
 }
 
 while(1){ //server loop will nerver exit unless any body kill the process 
  char buf[BUFFER_SIZE];
  long timestamp;
  socklen_t length = sizeof(cliaddr);

  clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
  if (clifd < 0){
   printf("error comes when call accept!\n");
   break;
  }
            
  strcpy(buf,WELCOME_MESSAGE);        

  printf("from client,IP:%s,Port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
  timestamp = time(NULL);
  strcat(buf,"timestamp in server:");
  strcat(buf,ctime(&timestamp));
 
  // read file rule.txt
  FILE* stream_src = fopen( "rule.txt", "r+" );
  if( stream_src==NULL ){
   printf("the file rule.txt is not opened correctly!\n");
   return 1;
  }
 
  while( fgets(s,sizeof(s),stream_src) ){ // 按行读取
   printf( "%s", s );
   strcat( buf,s );
  }
 
  // send file's content to client
  send(clifd,buf,BUFFER_SIZE,0);
  close(clifd);           
 }

 close(servfd);
 return 0;
}

#include <string>
#include <string.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <arpa/inet.h>

#define SERVER_PORT 20000 // define the defualt connect port id
#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port
#define BUFFER_SIZE 255
#define REUQEST_MESSAGE "welcome to connect the server.\n"

void usage(char *name)
{
 printf("usage: %s IpAddr\n",name);
}

int main(int argc, char **argv)
{   
 int servfd,clifd,length = 0;
 struct sockaddr_in servaddr,cliaddr;
 socklen_t socklen = sizeof(servaddr);
 char buf[BUFFER_SIZE];     

 if (argc < 2){
  usage(argv[0]);
  exit(1);
 }
 
 if ((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0){
  printf("create socket error!\n");
  exit(1);
 }

 srand(time(NULL));//initialize random generator
 bzero(&cliaddr,sizeof(cliaddr));
 cliaddr.sin_family = AF_INET;
 cliaddr.sin_port = htons(CLIENT_PORT);
 cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
 
 bzero(&servaddr,sizeof(servaddr));
 servaddr.sin_family = AF_INET;
 inet_aton(argv[1],&servaddr.sin_addr);
 servaddr.sin_port = htons(SERVER_PORT);
 //servaddr.sin_addr.s_addr = htons(INADDR_ANY);

 if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))<0){
  printf("bind to port %d failure!\n",CLIENT_PORT);
  exit(1);
 }

 if (connect(clifd,(struct sockaddr*)&servaddr, socklen) < 0){
  printf("can't connect to %s!\n",argv[1]);
  exit(1);
 }    

 length = recv(clifd,buf,BUFFER_SIZE,0);
 if (length < 0){
  printf("error comes when recieve data from server %s!",argv[1]);
  exit(1);
 }

 printf("from server %s :\n\t%s ",argv[1],buf);
    
 close(clifd);
 return 0;
}

相关推荐