用戶端:dl_client.c
#include "unp.h"
int main(int argc,char *argv[])
{
char recvbuff[50],buff[50],*p;
int sockfd,len,ret,test;
struct sockaddr_in serveraddr;
FILE *fp;
if(argc != 3){
printf("input:./client <IPaddress> <filename>/n");
return 0;
}
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
printf("socket error/n");
return 0;
}
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET,argv[1],&serveraddr.sin_addr) <= 0){
printf("inet_pton error for %s/n",argv[1]);
return 0;
}
if(connect(sockfd,(SA *)&serveraddr,sizeof(serveraddr)) < 0){
printf("connect error1/n");
return 0;
}
bzero(buff,sizeof(buff));
strcpy(buff,argv[2]);
send(sockfd,buff,sizeof(buff), 0);
bzero(buff,sizeof(buff));
sprintf(buff,"./dl_%s",argv[2]);
recv(sockfd,recvbuff,sizeof(recvbuff),0);
len = 0;
ret = 0;
if((len = atoi(recvbuff)) > 0){
p = (char *)malloc(len + 1);
bzero(p, len + 1);
test = recv(sockfd,p,len,0);
printf("***test = %d/n",test);
printf("***len = %d/n",len);
if((fp = fopen(buff,"w+")) != NULL){
ret = fwrite(p,len,1,fp);
fclose(fp);
}
free(p);
}
if(len != 0 && ret == 1)
printf("Download %s OK!/n",argv[2]);
else printf("Download error!/n");
close(sockfd);
return 0;
}
服務端:dl_server.c
#include "unp.h"
int Socket(int family,int type,int protocol)
{
int ret;
ret = socket(family,type,protocol);
if(ret < 0){
printf("socket error/n");
}
return ret;
}
void Bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen)
{
if(bind(sockfd,myaddr,addrlen) < 0)
printf("bind error/n");
}
void Listen(int fd, int backlog)
{
char *ptr;
if((ptr = getenv("LISTENQ")) != NULL)
backlog = atoi(ptr);
if(listen(fd,backlog) < 0)
printf("listen error/n");
}
int Fork()
{
if(fork() == 0)
return 0;
else
return -1;
}
int main(int argc,char *argv[])
{
char recvbuff[50],path[50],*p = NULL;
int listensock,connsock,ret,len;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in servaddr,cliaddr;
FILE *fp;
listensock = Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
Bind(listensock,(SA *)&servaddr,sizeof(servaddr));
Listen(listensock,LISTENQ);
for( ; ; ){
clilen = sizeof(cliaddr);
connsock = accept(listensock,(SA *)&cliaddr,&clilen);
if((childpid = Fork()) == 0){
bzero(recvbuff,sizeof(recvbuff));
bzero(path,sizeof(path));
recv(connsock,recvbuff,sizeof(recvbuff),0);
sprintf(path,"./%s",recvbuff);
ret = -1;
if((fp = fopen(path, "r")) != NULL){
fseek(fp, 0, SEEK_END);
len = ftell(fp);
p = (char *)malloc(len + 1);
bzero(p, len + 1);
fseek(fp, 0, SEEK_SET);
ret = fread(p,len + 1,1,fp);
fclose(fp);
}
if(ret != -1){
bzero(path,sizeof(path));
sprintf(path,"%d",len);
send(connsock,path,sizeof(path),0);
send(connsock,p,len + 1,0);
}
else{
len = 0;
bzero(path,sizeof(path));
sprintf(path,"%d",len);
send(connsock,path,sizeof(path),0);
}
free(p);
close(listensock);
return 0;
}
close(connsock);
}
}
包含的標頭檔:unp.h(從項目裡拿出來的,可能有出入)
#include <getopt.h>
#include <resolv.h>
#include <dirent.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#ifdef HAVE_SYS_SYSCTL_H
#include <sys/sysctl.h>
#endif
#ifdef HAVE_POLL_H
#include <poll.h>
#endif
#ifdef HAVE_SYS_EVENT_H
#include <sys/event.h>
#endif
#ifdef HAVE_STRINGS_H
#include <string.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_FILIO_H
#include <sys/filio.h>
#endif
#ifdef HAVE_SYS_SOCKIO_H
#include <sys/sockio.h>
#endif
#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif
#ifdef HAVE_ENT_IF_DL_H
#include <net/if_dl.h>
#endif
#ifdef HAVE_NETINET_SCTP_H
#include <netinet/sctp.h>
#endif
#ifdef _osf_
#undef recv
#undef send
#define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)
#define send(a,b,c,d) sendto(a,b,c,d,0,0)
#endif
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
#ifndef SHUT_RD
#define SHUT_RD 0
#define SHUT_WR 1
#define SHUT_RDWR 2
#endif
#ifndef INET_ADDRSTRLEN
#define INET_ADDRSTRLEN 16
#endif
#ifndef INET6_ADDRSTRLEN
#define INET_ADDRSTRLEN 46
#endif
#ifndef HAVE_BZERO
#define bzero(ptr,n) memset(ptr,0,n)
#endif
#ifndef HAVE_GETHOSTBYNAME2
#define gethostbyname2(host,family) gethostbyname((host))
#endif
struct unp_in_pktinfo{
struct in_addr ipi_addr;
int ipi_ifindex;
};
#ifndef CMSG_LEN
#define CMSG_LEN(size)
#endif
#ifndef CMSG_SPACE
#define CMSG_SPACE(size)
#endif
#ifndef SUN_LEN
#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
#endif
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
#ifndef INFTIM
#define INFTIM (-1)
#ifdef HAVE_POLL_H
#define INFTIM_UNPH
#endif
#endif
#define LISTENQ 1024
#define MAXLINE 4096
#define BUFFSIZE 8192
#define SERV_PORT 9877
#define SERV_PORT_STR "9877"
#define UNIXSTR_PATH "/tmp/unix.str"
#define UNIXDG_PATH "/tmp/unix.dg"
#define SA struct sockaddr
#define HAVE_STRUCT_SOCKADDR_STORAGE
#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
#define _SS_MAXSIZE 128
#define _SS_ALIGNSIZE (sizeof(int64_t))
#ifdef HAVE_SOCKADDR_SA_LEN
#define _SS_PAD1SIZE (_SS_ALIGNSIZE -sizeof(u_char) -sizeof(sa_family_t))
#else
#define _SS_PAD1SIZE (_SS_ALIGNSIZE -sizeof(sa_family_t))
#endif
#define _SS_PAD2SIZE (_SS_MAXSIZE -2*_SS_ALIGNSIZE)
struct sockaddr_storage{
#ifdef HAVE_SOCKADDR_SA_LEN
u_char ss_len;
#endif
sa_family_t ss_family;
char _ss_pad1[_SS_PAD1SIZE];
int64_t _ss_align;
char _ss_pad2[_SS_PAD2SIZE];
};
#endif
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
typedef void Sigfunc(int);
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))
#ifndef HAVE_ADDRINFO_STRUCT
//#include "../lib/addrinfo.h"
#endif
#ifndef HAVE_IF_NAMEINDEX_STRUCT
struct if_nameindex{
unsigned int if_index;
char *if_name;
};
#endif
分別編譯用戶端和服務端,並運行。一個簡單資料轉送就OK了!
也是從csdn上看的!自己實踐了一下!沒問題!不過!要注意linux系統區域網路的設定!