文章目录

  • 一、要求
  • 二、实现提示:
  • 三、程序
  • 四、现象

一、要求

  利用Linux Socket进行文件传输,本次只支持client端向sever端上传文件

二、实现提示:

client.c

  • client的参数有两个,分别是服务器主机名和端口;
  • 在while循环中输入你想要传输的文件名,然后建立socket,通过服务器主机名和端口连接服务器;
  • 打开文件,在while循环中读取文件,发送文件

sever.c

  • 在while循环中accept客户端的连接,接受数据并写入文件中
  • 也可以选择select()accept客户端的连接,在while循环中接受数据并写入文件中

三、程序

sever.c (服务器端):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>#define  PORT      5168
#define  MSGLEN    1024int main(int argc, char **argv)
{int severFd, clientFd;int fp,flags;socklen_t addrlen;struct sockaddr_in severAddr, clientAddr;char recvBuff[MSGLEN];char filename[100];int recv_len;if((severFd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("sockst() error");exit(-1);}severAddr.sin_family = AF_INET;severAddr.sin_port   = htons(PORT);severAddr.sin_addr.s_addr = htons(INADDR_ANY);bzero(&severAddr.sin_zero, 8);if(bind(severFd, (struct sockaddr*)&severAddr, sizeof(struct sockaddr)) == -1) {perror("bind() error");exit(-1);}if(listen(severFd, 1) == -1) {perror("listen() error");exit(-1);}addrlen =sizeof(struct sockaddr);while(1) {flags = 0;if((clientFd = accept(severFd, (struct sockaddr*)&clientAddr, &addrlen)) == -1){perror("accept() error");exit(-1);}printf("recv file fome ip:%s  port: %d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));if(recv(clientFd, filename, sizeof(filename), 0) < 0){perror("recv filename error");break; //less}fp = open(filename, O_RDWR | O_CREAT, 777);while((recv_len = recv(clientFd, recvBuff, MSGLEN, 0)) > 0) {flags++;if(flags == 1) {printf("recv file start");}else {printf(".");}if(write(fp, recvBuff, recv_len)) {bzero(&recvBuff, MSGLEN);    }else {perror("write() error");break;}} if(flags == 0) perror("recv() error");if(flags > 0){printf("\nrecv success\n");close(clientFd);}}close(severFd);return 0;
}

client.c(客户端):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>#define MSGLEN 1024struct ADDR {int port;char name[32];
};void file_send(struct ADDR addr, char *filename)
{int sockfd;FILE* fp;struct sockaddr_in sevrAddr;struct hostent *host;char readBuff[MSGLEN];int len;host = gethostbyname(addr.name);if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket() error");exit(-1);}elseprintf("socket ok\n");sevrAddr.sin_family = AF_INET;sevrAddr.sin_port   = htons(addr.port);sevrAddr.sin_addr   = *((struct in_addr*)host->h_addr);bzero(&sevrAddr.sin_zero, 8);
//    printf("ok2\n");if(connect(sockfd, (struct sockaddr*)&sevrAddr, sizeof(struct sockaddr)) == -1){perror("connect() error");exit(-1);}elseprintf("connect ok\n");//    fp = open(filename, O_RDONLY);if(send(sockfd, filename, sizeof(filename), 0) < 0) {perror("send filename error");exit(-1);}fp = fopen(filename, "rb");if(fp != NULL){printf("send file");while(1) {if((len = fread(readBuff, 1, MSGLEN, fp)) > 0) {if(send(sockfd, readBuff, len, 0) < 0){perror("send() error");exit(-1);} else {printf(".");bzero(&readBuff, MSGLEN);    }                } else if(len == 0){  //等于0表示文件已到末尾//            send(sockfd, readBuff, strlen(readBuff), 0);printf("\nfile send success\n");break;} else {perror("read() error");exit(-1);}}}else {printf("open file failed\n");exit(-1);}fclose(fp);close(sockfd);
}int main(int argc, char **argv)
{struct ADDR useraddr;char filename[100]; if(argc != 3) {printf("Usage: ./client [hostname] [port]");exit(-1);}strcpy(useraddr.name, argv[1]);useraddr.port = atoi(argv[2]);while(1) {printf("please input filename of you want send\n");fgets(filename, 20, stdin);filename[strlen(filename)-1] = 0;
//        printf("ok1\n");file_send(useraddr, filename);}return 0;
}

四、现象

  略(已实验,运行正确)

关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

Linux 利用socket实现文件传输相关推荐

  1. win7系统两台电脑之间利用Socket实现文件传输---C++实现

    参考:http://www.jb51.net/article/53732.htm 本博客主要实现了简单win7系统下,两台电脑之间(客户机与服务器)的文件传输,主要是基于Windows网络编程中win ...

  2. Socket网络程序设计(4) ———— 实现linux和windows的文件传输

    用TCP/TP进行网际互连(4) ---- 实现linux和windows的文件传输 1.实现要求 · 在循环面向连接的程序基础上,利用tcp完成linux和windows平台的文件传输 · 对服务器 ...

  3. Linux平台基于socket的文件传输服务器和客户端

    Linux平台基于socket的文件传输服务器和客户端 目录 前言 一.服务器程序结构 二.客户程序结构 三.代码 1.服务器主程序video_serv_fork.c 2.服务器子程序video_tr ...

  4. C++利用SOCKET传送文件

    C++利用SOCKET传送文件 /*server.h*/ #pragma comment(lib, "WS2_32") #include <WinSock2.h> #i ...

  5. ftp服务器文件传输安全性创新点,利用FTP进行文件传输时的主要安全问题存在于...

    类型:文件管理大小:7.7M语言:中文 评分:10.0 标签: 立即下载 利用FTP进行文件传输时的主要安全问题存在于什么是大家比较关心的,很多小伙伴们不知道这个答案是什么,想要知道这个答案的小伙伴们 ...

  6. Java 基于TCP的socket实现文件传输

    Java 基于TCP的socket实现文件传输 基于TCP的socket结合java的io流 实现客户端与服务器之间的文件传输 Socket 套接字(socket)是一个抽象层,应用程序可以通过它发送 ...

  7. 自己动手写简单的web应用服务器(4)—利用socket实现文件的下载

    直接上源码: 服务器: 1 package download; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOut ...

  8. linux系统中的文件传输

    Linux系统中的文件传输 1 实验环境 2 scp命令 3 rsync命令 3.1 rsync和scp命令对比 3.2 rsync命令用法 4 文件的归档压缩 4.1 文件归档 4.2 文件压缩 4 ...

  9. 在linux上安装Filezilla文件传输FTP软件

    在linux上安装Filezilla文件传输FTP软件 1 Filezilla安装方法一:使用apt-get安装 2 Filezilla安装方法二:使用filezilla安装包进行安装 1 Filez ...

最新文章

  1. 【MongoDB学习之一】初始MongoDB
  2. node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试
  3. matlab simulink_运用MATLAB和Simulink开发自动驾驶控制系统
  4. SQLServer之删除存储过程
  5. [Android]使用platform密钥来给apk文件签名的命令
  6. wget下载一个目录下的文件
  7. java非法字符65288,spring-boot使用内置tomcat时http请求非法字符过滤的问题
  8. Qt error: collect2: error: ld returned 1 exit status
  9. OpenDDS简单示例,轻松入门
  10. 百度文库刷财富值软件-第二版
  11. 【Winform-右下角弹窗】实现右下角弹窗,提示信息
  12. My Eighty-third Page - 打家劫舍Ⅲ - By Nicolas
  13. 7-13 愿天下有情人都是失散多年的兄妹 (25 分)
  14. 病案系统实施-基本知识-持续更新
  15. 一款实用的综合性导航网站
  16. 15.2. logrotate - rotates, compresses, and mails system logs
  17. 鸿蒙开发板Hi3861_通过GPIO12 PWM蜂鸣器播放<涛声依旧>-——基于code-2.0-CANARY
  18. linux中mkfs是什么命令,如何在Linux中使用mkfs命令[用于磁盘格式化]
  19. 2022!影响百万用户金融信用评分,Equifax被告上法庭,罪魁祸首——『数据漂移』!
  20. 智慧养老系统解决方案

热门文章

  1. 电力电子技术(8)——器件的串联和并联使用
  2. 手把手教你用Smartbi制作人口热力图,还不赶紧收藏起来
  3. LeetCode 827 最大人工岛 题解
  4. 软件测试中条件覆盖例子,判定覆盖条件覆盖软件测试.ppt
  5. clangllvm简介
  6. 安阳7中计算机绘画知识,美术基础知识测试题及答案
  7. Google“员工”大曝内幕(精彩)
  8. html文字自动大小写,CSS中首字母大写如何实现
  9. AI赋能医疗大健康产业 千亿市场触手可及
  10. 如何生成精确的调频载波和线性调频脉冲雷达测试信号?(一)