socket简单文件传输实例

今天在linux系统上写了一个简单的socket文件传输的例子,共享出来仅供参考。例子很简单,只要初学者了解简单的几个socket相关函数和文件函数就能写的出来。


服务器端程序:



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

#define BUF_SIZE      1024
#define SERVER_PORT   1234

int main()
{
char *filename = "sendfile.txt";
FILE *fp = fopen(filename,"rb" );
if(fp == NULL )
{
printf("open file error!!\r\n");
exit(1);
}
else
{
printf("open file succeed\r\n");
}

int server_sockfd = socket(AF_INET,SOCK_STREAM,0);
///bind listen
struct sockaddr_in server_sockAddr;
memset(&server_sockAddr,0 , sizeof(server_sockAddr));
server_sockAddr.sin_family = PF_INET;
server_sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
server_sockAddr.sin_port = htons(SERVER_PORT);

if(bind(server_sockfd,(struct sockaddr *)&server_sockAddr,\
sizeof(server_sockAddr) ) == -1)
{
perror("bind error\r\n");
exit(1);
}

if(listen(server_sockfd,20) == -1)
{
perror("listen error\r\n");
exit(1);
}

///accept
struct sockaddr_in client_addr;
int clnSize = sizeof(client_addr);
int conn = accept(server_sockfd,(struct sockaddr*)&client_addr,&clnSize);
if(conn <0)
{
perror("accept error!\r\n");
exit(1);
}

/// 循环发送文件直到末尾;
char buffer[BUF_SIZE]={0};
int send_len = 0;
while((send_len = fread(buffer,1, BUF_SIZE,fp)) >0)
{
    send(conn, buffer, send_len, 0);
}
shutdown( conn, SHUT_WR);
recv(conn,buffer,BUF_SIZE, 0);

fclose(fp);
close(conn);
close(server_sockfd);

return 0;
}

客户端程序:



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


int main()
{
///手动输入创建你文件
char filename[100]; //保存文件名
printf("input the file name: ");
gets(filename);
//scanf("Input file name to save:%s ", filename);
FILE *fp = fopen(filename, "wb");
if(fp == NULL){
printf("open file failed!!\r\n");
exit(1);
}

//定义客户端socketfd
int sock_cli = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP);

//connect
struct sockaddr_in serveraddr;
serveraddr.sin_family = PF_INET;
serveraddr.sin_port = htons(1234);
serveraddr.sin_addr.s_addr =inet_addr("127.0.0.1");

if (connect(sock_cli,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) <0)
{
	perror("connect failed!\r\n");
	exit(1);
}
int ncount = 0;
char recvbuf[1024] = {0};
while( (ncount = recv(sock_cli, recvbuf, 1024, 0)) >0) {
    
fwrite(recvbuf, 1, ncount, fp);
}

puts("file transfer succeed!!\r\n");
memset(recvbuf, 0, 1024);
fclose(fp);
close(sock_cli);
return 0;
}

然后呢我们在linux命令行下对这两个文件分别编译,别说你不会编译的命令哈。

先执行服务器端的程序

扫描二维码关注公众号,回复: 1712182 查看本文章


再执行客户端的程序:


完了后你会发现当前目录下多了一个你在客户端手动创建的文件,文件内容与服务器端传送过来的文件内容一致!

总结下:其实呢,socket的文件传输和socket一般的字符串通信差不多的,将文件的内容读出来发送到对端而已。




猜你喜欢

转载自blog.csdn.net/muaxi8/article/details/53511723
今日推荐