总结:

几个学到的东西:

这里可以错误查找(搜索你的错误码)


加断点调试:


实现的时候

先sever后client 启动新实例

然后client下就会有sever下面的图片,这里重命名为牛爷爷

若要实现其他文件的传输(如一个视频啥的或者其他东西)

把这个.c下面的文件大小改了就行 ,并且更换client.c下要传输的文件名称。


代码: 

依次是fileOperation.h

#ifndef __FILEOP_H_
#define __FILEOP_H_
#include "tcpSocket.h"//————服务器——————
//读取文件
bool readFile(const char* fileName);
//发文件
bool sendFile(SOCKET s, const char* fileName);
//————客户端————
//接受文件bool recvFile(SOCKET s, const char* fileName);
//保存文件(写)
bool savefile(const char*  fileName);
#endif //

tcpSocket.h

#ifndef _TCPSOCKET_H_ //头文件防止重复包含
#define _TCPSOCKET_H_
#include <stdbool.h>
#include <WinSock2.h>//头文件
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")//库文件#define err(errMsg) printf("[error] %s failed,code %d \
line:%d\n",errMsg,WSAGetLastError(),__LINE__);//三个参数为错误信息,错误码,行#define PORT 6789//初始化网络库
bool init_Socket();
//关闭网络库
bool close_Socket();
//服务器:创建服务器socket
SOCKET create_serverSocket();
//客户端:创建客户端socket
SOCKET create_clientSocket(const char*ip);
#endif

client.c

#include "../tcpSocket/tcpSocket.h"
#include "../tcpSocket/fileOperation.h"
int main() {init_Socket();SOCKET fd = create_clientSocket("127.0.0.1");//本地回环printf("connect server successed..\n");recvFile(fd, "牛爷爷.png");/*char recvBuf[1024] = "";int ret=recv(fd, recvBuf, 1024, 0);if (ret == 0)printf("服务器正常下线...\n");else if (ret < 0) {err("recv");}puts(recvBuf);char sendBuf[1024] = "你今天没洗头吧";send(fd, sendBuf,strlen(sendBuf),0);*/closesocket(fd);close_Socket();getchar();return 0;
}

fileOperation.c

#include"fileOperation.h"
long g_fileSize=20222;//保存文件大小
char* g_fileBuf; //保存文件数据
bool readFile(const char* fileName)
{FILE* read = fopen(fileName, "rb");//二进制方式打开if (!read) {perror("file open failed :\n");//获取错误码return false;}//获取文件大小fseek(read, 0, SEEK_END);//将文件位置指针移动到最后g_fileSize = ftell(read);fseek(read, 0, SEEK_SET); //移动到开头printf("filesize :%d\n", g_fileSize);//分配内存g_fileBuf = (char*)calloc(g_fileSize, sizeof(char));//OK?   if (!g_fileBuf)return false;//把文件读到内存中来fread(g_fileBuf, sizeof(char), g_fileSize, read);//read是前面创建的read文件fclose(read);return true;
}bool sendFile(SOCKET s, const char* fileName)
{readFile(fileName);int ret = send(s, g_fileBuf, g_fileSize, 0);if (ret == SOCKET_ERROR){err("sendFile");return false;}printf("发送成功(%d)Byte\n", ret);return false;
}bool recvFile(SOCKET s, const char* fileName)
{if (g_fileBuf == NULL) {g_fileBuf = (char*)calloc(g_fileSize, sizeof(char));if (!g_fileBuf)return false;}int ret=recv(s, g_fileBuf, g_fileSize, 0);if (ret == 0)printf("服务器正常下线...\n");else if (ret < 0) {err("recv");}savefile(fileName);return false;
}bool savefile(const char* fileName)
{FILE* write = fopen(fileName, "wb");if (!write) {perror("file open failed :\n");return false;}fwrite(g_fileBuf, sizeof(char), g_fileSize, write);fclose(write);return true;
}

tcpSocket.c

#include "tcpSocket.h"bool init_Socket()
{WSADATA wsadata;if(0 != WSAStartup(MAKEWORD(2,2),&wsadata)) //windows socket ansys windows异步套接字{  //不等于0表示失败//printf("[error]WSAStartup failed,code %d", WSAGetLastError());err("WSAStartup");return false;}return true;}bool close_Socket()
{if (0 != WSACleanup()) //windows socket ansys windows异步套接字{err("WSACleanup");return false;}return true;
}SOCKET create_serverSocket()
{//创建一个空的socketSOCKET fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//ipv4,流式,协议if (INVALID_SOCKET == fd){err("socket");return INVALID_SOCKET;}//给socket绑定本地IP和端口号struct sockaddr_in addr;addr.sin_family = AF_INET; //ipv4addr.sin_port = htons(PORT);//把本地字节序转为网络字节序addr.sin_addr.S_un.S_addr = ADDR_ANY;//绑定本地任意ipif (SOCKET_ERROR == bind(fd, (struct sockaddr*)&addr, sizeof(addr))) {err("bind");return INVALID_SOCKET;//理解成-1即可}//开始监听listen(fd, 10);return fd;
}SOCKET create_clientSocket(const char* ip)
{//创建一个空的socketSOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == fd){err("socket");return INVALID_SOCKET;}//给socket绑定 服务端 IP和端口号struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(PORT);addr.sin_addr.S_un.S_addr = inet_addr(ip);//绑定服务器ipif (INVALID_SOCKET == connect(fd, &addr, sizeof(addr))) {err("connect");return INVALID_SOCKET;}return fd;
}

sever.c

#include "../tcpSocket/tcpSocket.h"
#include "../tcpSocket/fileOperation.h"
//int main11() {
//  readFile("./niuyeye.png");
//  //getchar();验证大小取消该行
//  savefile("吹风.png");
//  return 0;
//}
int main()
{init_Socket();SOCKET serfd = create_serverSocket();printf("server create successed ,wait client connect...\n");//等待客户端链接SOCKET clifd = accept(serfd, NULL, NULL);if (clifd == INVALID_SOCKET) err("accpet");printf("友好的问候一下");//可以和客户端通信了sendFile(clifd,"./niuyeye.png");/*if (SOCKET_ERROR == send(clifd, "fuck", 4, 0)) {err("fuck send");}*//*char recvBuf[1024] = "";int ret = recv(clifd, recvBuf, 1024, 0);if (ret == 0)printf("客户端正常下线...\n");else if (ret < 0) {err("recv");}puts(recvBuf);*/closesocket(clifd);closesocket(serfd);close_Socket();getchar();return 0;
}

socket文件传输相关推荐

  1. Java基于Socket文件传输示例

    这个实例中的socket文件传输采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出流进行包装,加快传输的速度. 先来看服务器端的程序. 1.服务器端 import java.io.Buffere ...

  2. Androidpcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住说话的demo

    pcm格式音频编解码及播放,socket文件传输通讯,soundTouch变声框架 合成的一款仿微信语音按住播放的demo 效果:   -------------- 代码: MainActivity ...

  3. socket文件传输服务器,Socket文件传输(含服务端以及客户端源码)

    Socket文件传输 [实例简介] 传输任意格式文件 [实例截图] [核心代码] using System; using System.Collections.Generic; using Syste ...

  4. 【Linux系统与网络编程】15:Socket文件传输1

    Socket文件传输1 在socket多线程实现多客户端连接服务器进行聊天的基础上,添加文件传输功能. fix1 在server.c中添加file_info结构体,用于单独接受某次客户端发送的file ...

  5. 【Linux系统与网络编程】16:Socket文件传输2

    Socket文件传输2 OVERVIEW Socket文件传输2 在socket文件传输1中使用了一种在buff缓冲数组后添加\0的方式实现文件的传输. 实现方法2:根据TCP在数据传输过程中进行粘包 ...

  6. c语言socket发送excel,socket文件传输功能的实现

    服务端: #include #include #pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll #define BUF_SI ...

  7. Java基于Socket文件传输示例(转)

    最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...

  8. Linux网络编程之socket文件传输示例

    本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. ...

  9. C#Socket文件传输(发送与接收代码)

    原文链接:http://www.cnblogs.com/reynoldchan/p/3762014.html 这里是发送的代码: SendVarData是转码后发送函数 1 /// <summa ...

最新文章

  1. 官宣!这些北京高校,去雄安!
  2. 2019年春季学期第七周作业
  3. AC自动机 HDU 2222
  4. ubuntu编译linux报错/bin/sh: 1: mkimage: not found
  5. linux服务 Systemd 简介
  6. 操作系统之I/O管理:4、缓冲区管理(单缓冲、双缓冲、循环缓冲、缓冲池)
  7. windows编译libevent
  8. 编写10ms延时的子程序c语言,求解!!!用汇编语言编写延时程序问题!!!!...
  9. python 捕获多个异常_Python捕获多个异常
  10. Win Form中限制TextBox只能输入数字
  11. vs2015 ankhsvn插件(AnkhSVN) v2.7.0.6493
  12. 【数据结构】串(定长顺序串、堆串、块链串)的存储结构及基本运算(C语言)
  13. physx中ray不碰撞某些物体的方法
  14. 树梅派应用38:树莓派 SAKS 扩展板挑战应用 之 PM2.5 指示灯
  15. ios打包ipa 命令安装ipa到iphone
  16. word文档图片显示不全,显示一部分,图片在文字下面怎么办?
  17. 天道酬勤,奋斗不止!
  18. 验证的方法篇之七:性能验证
  19. 【学习笔记 — Flink 处理迟到数据(★)】
  20. C语言论坛系统[2023-01-03]

热门文章

  1. 一个女测试工程师的成长之路
  2. 如何通过WWW下载图片 学习笔记
  3. TIM-定时器——STM32
  4. kali如何切换成中文
  5. CSGO必way电竞9月28日ESL职业联赛2组队伍前瞻
  6. onedrive的多电脑同步妙用
  7. html控制两个页面转换,html页面切换过度效果实现方案_蓝戒的博客
  8. Mybatis中大于号和小于号表示方式
  9. APP项目开发失败案例经验汇总
  10. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...