Linux C Socket编程:文件上传
一个服务端等待, 客户端上传文件到服务端,通过输入要上传的文件名,目前只做到仅对当前执行文件的目录下的文件,应该在服务端收到文件路径之后进行处理的。
服务端代码:
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero #define SERVER_PORT 6666
#define LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv)
{
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT); //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
int server_socket = socket(PF_INET, SOCK_STREAM, );
if (server_socket < )
{
printf("Create Socket Failed!");
exit();
} //把socket和socket地址结构联系起来
if (bind(server_socket, (struct sockaddr*) &server_addr,
sizeof(server_addr)))
{
printf("Server Bind Port: %d Failed!\n", SERVER_PORT);
exit();
} //server_socket用于监听
if (listen(server_socket, LISTEN_QUEUE))
{
printf("Server Listen Failed!");
exit();
} while ()
{
//定义客户端的socket地址结构client_addr
char buffer[BUFFER_SIZE];
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr); int client_socket = accept(server_socket,
(struct sockaddr*) &client_addr, &length);
if (client_socket < )
{
printf("Server Accept Failed!\n");
break;
}
bzero(buffer, BUFFER_SIZE);
// 获取客户端要传输的文件名
length = recv(client_socket, buffer, BUFFER_SIZE, );
if (length < )
{
printf("Server Recieve Data Failed!\n");
break;
}
char file_name[FILE_NAME_MAX_SIZE + ];
bzero(file_name, FILE_NAME_MAX_SIZE + );
strncpy(
file_name,
buffer,
strlen(buffer) > FILE_NAME_MAX_SIZE? FILE_NAME_MAX_SIZE : strlen(buffer)); // 新建文件
FILE * fp = fopen(file_name, "w");
if (NULL == fp)
{
printf("File: %s CAN NOT WRITE!\n", file_name);
}
else
{
bzero(buffer, BUFFER_SIZE);
int file_block_length = ;
while ((file_block_length = recv(client_socket, buffer, BUFFER_SIZE, )) > )
{
if (file_block_length < )
{
printf("Recieve Data From Client Failed!\n");
break;
}
int write_length = fwrite(buffer, sizeof(char), file_block_length, fp);
if (write_length < file_block_length)
{
printf("File: %s Write Failed\n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
fclose(fp);
printf("File: %s Transfer Finished\n\n", file_name);
}
//关闭与客户端的连接
close(client_socket);
}
//关闭监听用的socket
close(server_socket);
return ;
}
客户端代码:
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/ #define SERVER_PORT 6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv)
{
if (argc != )
{
printf("Please input the IP address of the server \n", argv[]);
exit();
} //设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr)); //把一段内存区的内容全部设置为0
client_addr.sin_family = AF_INET; //internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY); //INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(); //0表示让系统自动分配一个空闲端口
//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
int client_socket = socket(AF_INET, SOCK_STREAM, );
if (client_socket < )
{
printf("Create Socket Failed!\n");
exit();
}
//把客户机的socket和客户机的socket地址结构联系起来
if (bind(client_socket, (struct sockaddr*) &client_addr,
sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit();
} //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
if (inet_aton(argv[], &server_addr.sin_addr) == ) //服务器的IP地址来自程序的参数
{
printf("Server IP Address Error! \n");
exit();
} server_addr.sin_port = htons(SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
// 向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if (connect(client_socket, (struct sockaddr*) &server_addr,
server_addr_length) < )
{
printf("Can Not Connect To %s!\n", argv[]);
exit();
} // 连接上服务器, 选择要上传的文件
char file_name[FILE_NAME_MAX_SIZE + ];bzero
(file_name, FILE_NAME_MAX_SIZE + );
printf("Please Input File Name Upload To Server: ");
scanf("%s", file_name); char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
strncpy(buffer, file_name,
strlen(file_name) > BUFFER_SIZE? BUFFER_SIZE : strlen(file_name)); FILE * fp = fopen(file_name, "r");
if (NULL == fp)
{
printf("File: %s NOT FOUND! \n", file_name);
exit();
} // 发送文件名
int nameLength = send(client_socket, buffer, BUFFER_SIZE, );
if (nameLength < )
{
printf("File name Error! \n");
exit();
} bzero(buffer, BUFFER_SIZE);
int file_block_length = ; while ((file_block_length = fread(buffer, sizeof(char), BUFFER_SIZE, fp))
> )
{
if (send(client_socket, buffer, file_block_length, ) < )
{
printf("Send File:\t%s Failed\n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
printf("File:\t%s Transfer Finished\n", file_name);
fclose(fp);
close(client_socket);
return ;
}
代码很多是复制的,慢慢看一行行看懂之后把原来别人的客户端下载改成客户端上传,其实都差不多,服务端与客户端connect之后基本上就是文件读写的事了。
来自:http://www.cnblogs.com/lycheng/archive/2011/11/08/2240518.html
Linux C Socket编程:文件上传的更多相关文章
- Python Socket实现文件上传(TCP协议)
在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...
- socket实现文件上传(客户端向服务器端上传照片示例)
本示例在对socket有了基本了解之后,可以实现基本的文件上传.首先先介绍一下目录结构,server_data文件夹是用来存放客户端上传的文件,client_data是模拟客户端文件夹(目的是为了测试 ...
- Linux小工具:文件上传ftp服务器
工作期间,每次将文件上传至ftp服务器时,均需要手工输入ip.用户名.密码等,因此,考虑编写脚本完成文件的上传任务.具体的脚本sync.sh如下: #!/bin/bash source ~/.bash ...
- PHP核心编程--文件上传(包含多文件上传)
一.单文件上传 图片上传界面: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- linux 客户端与linux服务器端连接与文件上传下载
linux客户端连接linux服务器 用ssh 可以用 man ssh 查看用法 基本格式: ssh 用户名@主机名 如: ssh root@1.1.1.1 linux客户端上传文件到 linux 服 ...
- linux下将本地文件上传到github中?
今天编写一份Python基础代码,经过Linux上传到github上,遇到点问题,已经解决 1.首先sudo su 进入root 用户 2.ls 检查出当前文件下有什么文件 3. cd 进入你将要上传 ...
- python2.7入门---CGI编程&文件上传&文件下载
这次我们来看下文件下载和上传的操作.首先是上传,HTML设置上传文件的表单需要设置 enctype 属性为 multipart/form-data,代码如下所示: <!DOCTYPE h ...
- ASP.NET Web API编程——文件上传
首先分别介绍正确的做法和错误的做法,然后分析他们的不同和错误之处,以便读者在实现此功能时可避开误区 1正确的做法 public class AvaterController : BaseApiCont ...
- C# Socket大文件上传
public sealed class SocketData { private SocketData() { } public static SendFileMode SendFile(Socket ...
- 从原理角度解析Android (Java) http 文件上传
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23781773 文件上传是我们项目中经常使用的功能,一般我们的服务器可能都是web ...
随机推荐
- URI和URL、REST
URI和URL URI(Uniform Resource Identifier ) 是一个紧凑的字符串用来标示抽象或物理资源.可以分为URL,URN或同时具备locators 和names特性的一个东 ...
- jar包中存在包名和类名都相同的情况
情况: 在maven中引入两个包都有项目的包名和类名,只是jar包的名字不同.两个包的一部分在代码中的不同地方都需要用到. 网上找的大部分都是: 只有改变编译器优先选择的jar顺序(这个顺序是可以改变 ...
- 前端学习笔记--html入门
1.什么是html 2.标签和元素: 标签可嵌套,要注意缩进 html文档中的元素分为:内容文本.标签 3.标签和属性: 4.html的文件结构: 5.标签 a标签: 还不知道跳转到哪里,可以使用虚拟 ...
- 23 export default和export的使用方式
在Node中 使用 var 名称 = require('模块标识符') module.export 和exports来暴露成员 //这是 Node中向外暴露成员的形式: module.exports= ...
- MySQL5.7版本安装(压缩包形式)
1.去官网下载 MySQL 压缩包 2.配置环境变量 3.创建配置文件my.ini (放置 mysql-5.7.28-winx64 目录下) my.ini 配置文件 编写如下内容 [client] p ...
- Selenium常用API的使用java语言之5-selenium元素定位
1.selenium定位方法 Selenium提供了8种定位方式. id name class name tag name link text partial link text xpath css ...
- python中的_xx, __xx, __xx__
一.从模块分析 ######## bb.py (一个用来导入的模块) ########## var = 0_var = 1__var = 2__var__ = 3 1. from module im ...
- iwap:修改菜单树文件
1.添加mysql数据库连接的jar包. 2.
- 8.1.T1
string 题面什么的 抱歉,被我咕咕咕了 考场思路: sort大法好 n2log2n过 40% 令人着实兴奋 正解: 线段树+桶 利用只有26个字母的优势 好吧,26个字母,只怪我没想到 代码: ...
- 通过ResultSet获取到rs的记录数的几种方法
方法一:利用ResultSet的getRow方法来获得ResultSet的总行数 ResultSet rs = ps.executeQuery(sql); rs.last(); //移到最后一行 in ...