设为首页 加入收藏

TOP

Linux TCP 文件传输模块(一)
2014-11-24 03:29:26 来源: 作者: 【 】 浏览:0
Tags:Linux TCP 文件 传输 模块

CLIEN端发给SERVER端.发送数据包的格式是:


1.文件名的大小


2.文件名


3.文件数据大小


4.文件数据



common.h:公共信息


#ifndef COMMON_H
#define COMMON_H


#define SERVER_IP "192.168.0.88"
#define SERVER_PORT 60021
#define MAX_CONNETCTION 30
#define DEBUG


#endif /*COMMON_H*/


client端


net_send.h:定义了文件传输的相关结构体


#ifndef NET_SEND_H
#define NET_SEND_H


#define MAX_FILE_NAME 255
#define BUF_SIZE 512


#define FD_NOT_SET 0
#define FD_OK 1


#define FAILED -1
#define SUCCESS 0


typedef struct net_file{
int file_name_size;
unsigned long file_data_size;
int fd;
int fd_stat;
char file_to_send[MAX_FILE_NAME];
char buf[BUF_SIZE];
}netfile_t;


int open_net_file(netfile_t *netfile,char *filename);
int send_net_file(netfile_t *netfile,char *server_ip,short server_port);
void close_net_file(netfile_t *netfile);


#endif /*NET_SEND_H*/


net_send.c:实现文件,关键步骤红色标记


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "common.h"
#include "net_send.h"


static unsigned long get_file_size(char *filename)
{
struct stat f_stat;


if(stat(filename,&f_stat) < 0)
return 0;


return (unsigned long)f_stat.st_size;
}


int open_net_file(netfile_t *netfile,char *filename)
{
if(netfile == NULL || filename == NULL)
return ;


bzero(netfile,sizeof(netfile_t));


memcpy(netfile->file_to_send,basename(filename),strlen(basename(filename)));
#ifdef DEBUG
printf("netfile->file_to_send = \"%s\".\n",netfile->file_to_send);
#endif
netfile->fd = open(filename,O_RDONLY);


if(netfile->fd < 0)
{
netfile->fd_stat = FD_NOT_SET;
return FAILED;
}


netfile->file_name_size = strlen(netfile->file_to_send);
netfile->file_data_size = get_file_size(filename);
#ifdef DEBUG
printf("filesize = %d.\n",netfile->file_data_size);
#endif
if(netfile->file_data_size == 0)
{
close(netfile->fd);
netfile->fd_stat = FD_NOT_SET;
return FAILED;
}


netfile->fd_stat = FD_OK;
return SUCCESS;
}


/*-----sending data-----*/


static int send_block(int sock_fd,const char *buf,int size)
{
if(send(sock_fd,buf,size,0) < 0)
return FAILED;
return SUCCESS;
}


int send_net_file(netfile_t *netfile,char *server_ip,short server_port)
{
int sock_fd;
struct sockaddr_in server_addr;
int bytes_read;


if(netfile == NULL || server_ip == NULL)
return FAILED;


if(netfile->fd_stat == FD_NOT_SET)
return FAILED;


if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
return FAILED;


bzero(&server_addr,sizeof(struct sockaddr_in));


server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
server_addr.sin_addr.s_addr = inet_addr(server_ip);
#ifdef DEBUG
printf("server ip: %s.\n",inet_ntoa(server_addr.sin_addr));
#endif
if(connect(sock_fd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1)
{
#ifdef DEBUG
printf("Cannot connect to server.\n");
#endif
close(sock_fd);
return FAILED;
}

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 去掉 title bar 以及 sta.. 下一篇Linux下IP v6 tcp服务器端源码示例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)