一个服务端等待, 客户端上传文件到服务端,通过输入要上传的文件名,目前只做到仅对当前执行文件的目录下的文件,应该在服务端收到文件路径之后进行处理的。

服务端代码:

 #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编程:文件上传的更多相关文章

  1. Python Socket实现文件上传(TCP协议)

    在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...

  2. socket实现文件上传(客户端向服务器端上传照片示例)

    本示例在对socket有了基本了解之后,可以实现基本的文件上传.首先先介绍一下目录结构,server_data文件夹是用来存放客户端上传的文件,client_data是模拟客户端文件夹(目的是为了测试 ...

  3. Linux小工具:文件上传ftp服务器

    工作期间,每次将文件上传至ftp服务器时,均需要手工输入ip.用户名.密码等,因此,考虑编写脚本完成文件的上传任务.具体的脚本sync.sh如下: #!/bin/bash source ~/.bash ...

  4. PHP核心编程--文件上传(包含多文件上传)

    一.单文件上传 图片上传界面: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  5. linux 客户端与linux服务器端连接与文件上传下载

    linux客户端连接linux服务器 用ssh 可以用 man ssh 查看用法 基本格式: ssh 用户名@主机名 如: ssh root@1.1.1.1 linux客户端上传文件到 linux 服 ...

  6. linux下将本地文件上传到github中?

    今天编写一份Python基础代码,经过Linux上传到github上,遇到点问题,已经解决 1.首先sudo su 进入root 用户 2.ls 检查出当前文件下有什么文件 3. cd 进入你将要上传 ...

  7. python2.7入门---CGI编程&文件上传&文件下载

        这次我们来看下文件下载和上传的操作.首先是上传,HTML设置上传文件的表单需要设置 enctype 属性为 multipart/form-data,代码如下所示: <!DOCTYPE h ...

  8. ASP.NET Web API编程——文件上传

    首先分别介绍正确的做法和错误的做法,然后分析他们的不同和错误之处,以便读者在实现此功能时可避开误区 1正确的做法 public class AvaterController : BaseApiCont ...

  9. C# Socket大文件上传

    public sealed class SocketData { private SocketData() { } public static SendFileMode SendFile(Socket ...

  10. 从原理角度解析Android (Java) http 文件上传

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23781773 文件上传是我们项目中经常使用的功能,一般我们的服务器可能都是web ...

随机推荐

  1. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理   一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod p ...

  2. 使用poi导出固定excel的模板,出现汉字不能自动设置行宽

    因为在工作中,可能因为不同的原因遇到不同的问题,本人就分享遇到的一个大坑 因为我要将数据库中的一部分字段的名称作为Excel中的列名,所以需要导出汉字,然后在对应的汉字下面填充数据. 正是因为这部分汉 ...

  3. 安装Android Studio开发环境

    下载安装包 中文社区官网 http://android-studio.org/ 目前最新的是2.3.3版本 安装Android Studio 双击安装 等待安装包自动解压 下一步 选择安装Androi ...

  4. Robot Framework--完整的接口测试用例

    *** Settings *** Library Collections Library json Library requests Library RequestsLibrary Library H ...

  5. ES6中构造函数内super关键字的使用

    super关键字用于访问和调用一个对象的父对象上的函数. super.prop和super[expr]表达式在类和对象字面量任何方法定义中都是有效的. 语法 super([arguments]); / ...

  6. 使用 ajax 多次请求,并将结果集合并(ajax 非异步)

    直接上代码吧... 里面有注释 <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...

  7. Django后台中文乱码

    无论如何,刚开始一定要写上默认编码utf8!!!!!! 第一种办法: 检查 ...\Lib\site-packages\Django-1.10.2-py2.7.egg\django\conf\loca ...

  8. GIL 信号量 event事件 线程queue

    GIL全局解释器锁 官方解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple n ...

  9. vmware 共享文件夹不显示文件的问题

    上海SEO:安装vmtools后还是不显示执行以下操作//但是只有root权限才行 1:输入命令  sudo apt install open-vm-tools 安装工具2:输入命令 sudo vmh ...

  10. Linux OOM killer 与相关参数详解

    一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...