服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#define SERVER_PORT 8888
#define BACKLOG 10
#define BUF_SIZE 1024
int main(int argc,char **argv)
{
int iRet;
int length;
int iSocketServer;
int iSocketClient;
unsigned long total;
FILE *fp;
pid_t pid;
unsigned char ucBuf[BUF_SIZE] = {0};
struct sockaddr_in tSocketServerAddr;
struct sockaddr_in tSocketClientAddr;
iSocketServer = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == iSocketServer)
{
printf("socket error!\n");
return -1;
}
tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(SERVER_PORT);
tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
memset(tSocketServerAddr.sin_zero, 0, 8);
iRet = bind(iSocketServer,
(const struct sockaddr *)&tSocketServerAddr,
sizeof(struct sockaddr));
if(-1 == iRet)
{
printf("bind error!\n");
return 0;
}
iRet = listen(iSocketServer, BACKLOG);
if(-1 == iRet)
{
printf("listen error!\n");
return -1;
}
while(1)
{
pid = fork();
if(pid == 0)
{
iSocketClient = accept(iSocketServer, NULL, NULL);
if(-1 == iSocketClient)
{
printf("accept error!\n");
return -1;
}
iRet = recv(iSocketClient, ucBuf, BUF_SIZE, 0);
if(iRet < 0)
{
printf("recieve filename error!\n");
return -1;
}
printf("Request file: %s\n", ucBuf);
fp = fopen(ucBuf, "r");
if(NULL == fp)
{
printf("No such file!\n");
return -1;
}
printf("Start send file!\n");
total = 0;
while((length = fread(ucBuf, sizeof(char), BUF_SIZE, fp)) > 0)
{
printf("Send file data, length = %d\n", length);
if(send(iSocketClient, ucBuf, length, 0) < 0)
{
printf("Send error!\n");
return -1;
}
total += length;
memset(ucBuf, 0, BUF_SIZE);
}
printf("Send file success, total size = %lu\n", total);
close(iSocketClient);
fclose(fp);
return 0;
}
else if(pid > 0)
{
wait(NULL);
}
else
{
printf("fork error!\n");
}
}
close(iSocketServer);
return 0;
}
客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#define SERVER_PORT 8888
#define BUF_SIZE 1024
int main(int argc,char **argv)
{
int iRet;
int length;
int iSocketClient;
unsigned long total = 0;
FILE *fp;
unsigned char ucBuf[BUF_SIZE] = {0};
struct sockaddr_in tSocketServerAddr;
if(argc != 3)
{
printf("Usage:\n");
printf("%s <server_ip> <filename>\n",argv[0]);
return -1;
}
iSocketClient = socket(AF_INET, SOCK_STREAM, 0);
memset(tSocketServerAddr.sin_zero, 0, 8);
tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(SERVER_PORT);
if(0 == inet_aton(argv[1],&tSocketServerAddr.sin_addr))
{
printf("invalid server_ip\n");
return -1;
}
iRet = connect(iSocketClient,
(const struct sockaddr *)&tSocketServerAddr,
sizeof(struct sockaddr));
if(-1 == iRet)
{
printf("connect error!\n");
return -1;
}
iRet = send(iSocketClient, argv[2], BUF_SIZE, 0);
if(-1 == iRet)
{
printf("Send filename error!\n");
return -1;
}
fp = fopen(argv[2], "w");
if(NULL == fp)
{
printf("Create file error!\n");
return -1;
}
while(0 < (length = recv(iSocketClient, ucBuf, BUF_SIZE, 0)))
{
printf("Recieve data from %s, length = %d\n", argv[1], length);
total += length;
if(fwrite(ucBuf, sizeof(char), length, fp) < length)
{
printf("Write file error!\n");
return -1;
}
memset(ucBuf, 0, BUF_SIZE);
}
printf("Recieve file(%s) success, total size = %lu\n", argv[2], total);
fclose(fp);
close(iSocketClient);
return 0;
}