socket文件传输

总结:

几个学到的东西:

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


加断点调试:


实现的时候

 先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()
{
	//创建一个空的socket
	SOCKET 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; //ipv4
	addr.sin_port = htons(PORT);//把本地字节序转为网络字节序
	addr.sin_addr.S_un.S_addr = ADDR_ANY;//绑定本地任意ip
	if (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)
{
	//创建一个空的socket
	SOCKET 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);//绑定服务器ip
	if (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;
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值