在Linux环境下搭建服务器和客户端,实现客户端可从服务器下载图片的功能,
注意:图片需自己添加在服务器同一文件夹中
客户端与服务器可在不同文件夹中,方便查看图片下载成功与否
一、服务端功能实现
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
//创建套接字socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sockfd)
{
perror("socket error!\n");
return -1;
}
else
printf("socket success\n");
//绑定bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8989);
saddr.sin_addr.s_addr = inet_addr("192.168.7.219");
if(-1 == bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)))
{
perror("绑定失败!\n");
return -1;
}else
printf("绑定成功\n");
//监听listen
if(-1 == listen(sockfd, 1024))
{
perror("listen error!!\n");
return -1;
}
else
printf("listen success\n");
//等待连接
printf("connect>>>>>>>\n");
//连接accept
while(1)
{
int connfd = accept(sockfd, NULL, NULL);
if(-1 == connfd)
{
perror("连接失败!!\n");
return -1;
}
else
printf("连接成功\n");
while(1)
{
//接收文件名
char filename[32] = {0};
int dd = read(connfd, filename, sizeof(filename));
if(0 >= dd)
{
printf("connect>>>>>>>\n");
break;
}
//打开文件
int fd = open(filename, O_RDONLY);
if(-1 == fd)
{
perror("open error!\n");
return -1;
}
//计算文件大小
struct stat statbuf;
fstat(fd, &statbuf);
int len = statbuf.st_size;
printf("len = %d\n", len);
//发送文件大小
write(connfd, &len, sizeof(len));
//从文件中读数据
char data[1024] = {0};
while(1)
{
int ret = read(fd, data, sizeof(data));
if(0 == ret)
break;
//将读取到的数据发送给客户端
write(connfd, data, ret);
memset(data, 0, sizeof(data));
}
}
}
close(sockfd);
return 0;
}
二、客户端功能实现
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
//创建套接子
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sockfd)
{
perror("socket error!\n");
return -1;
}
else
printf("socket success\n");
//bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8989);
saddr.sin_addr.s_addr = inet_addr("192.168.7.219");
//connect
if(-1 == connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)))
{
perror("connect faild!\n");
return -1;
}
else
printf("connect success\n");
while(1)
{
//从终端输入数据
char filename[32] = {0};
read(0, filename, sizeof(filename));
filename[strlen(filename)-1] = 0;
//发送图片名称
write(sockfd, filename, sizeof(filename));
//打开并创建
int fd = open(filename, O_WRONLY|O_CREAT, 0644);
if(-1 == fd)
{
perror("open error!\n");
return -1;
}
//
int len = 0;
int count = 0;
read(sockfd, &len, sizeof(len));
printf("len: %d\n", len);
char data[1024] = {0};
int ret = -1;
while(count < len)
{
//接收图片数据
ret = read(sockfd, data, sizeof(data));
if(0 == ret)
break;
//写入本地文件
write(fd, data, ret);
//
count += ret;
}
}
return 0;
}