windows c语言传输文件,Windows网络编程之winsock实现文件传输示例

本文实例展示了Windows网络编程中winsock实现文件传输的方法,对于进行Windows下的winsock网络编程有一定的借鉴参考价值。

该程序代码主要是基于TCP流协议的winsock网络文件传输示例,采用Windows下的C语言编写。可以实现传递任何格式文件的文件传输功能。

具体实现代码如下:

Server端代码如下:

/*************************************************************************

> File Name: Win_Server.c

> Author: SongLee

************************************************************************/

#include

#include

#include

#include

#define PORT 8087

#define SERVER_IP "127.0.0.1"

#define BUFFER_SIZE 1024

#define FILE_NAME_MAX_SIZE 512

#pragma comment(lib, "WS2_32")

int main()

{

// 声明并初始化一个服务端(本地)的地址结构

sockaddr_in server_addr;

server_addr.sin_family = AF_INET;

server_addr.sin_addr.S_un.S_addr = INADDR_ANY;

server_addr.sin_port = htons(PORT);

// 初始化socket dll

WSADATA wsaData;

WORD socketVersion = MAKEWORD(2, 0);

if(WSAStartup(socketVersion, &wsaData) != 0)

{

printf("Init socket dll error!");

exit(1);

}

// 创建socket

SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0);

if (SOCKET_ERROR == m_Socket)

{

printf("Create Socket Error!");

exit(1);

}

//绑定socket和服务端(本地)地址

if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))

{

printf("Server Bind Failed: %d", WSAGetLastError());

exit(1);

}

//监听

if (SOCKET_ERROR == listen(m_Socket, 10))

{

printf("Server Listen Failed: %d", WSAGetLastError());

exit(1);

}

while(1)

{

printf("Listening To Client...\n");

sockaddr_in client_addr;

int client_addr_len = sizeof(client_addr);

SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len);

if (SOCKET_ERROR == m_New_Socket)

{

printf("Server Accept Failed: %d", WSAGetLastError());

break;

}

char buffer[BUFFER_SIZE];

memset(buffer, 0, BUFFER_SIZE);

if (recv(m_New_Socket, buffer, BUFFER_SIZE, 0) < 0)

{

printf("Server Receive Data Failed!");

break;

}

char file_name[FILE_NAME_MAX_SIZE+1];

memset(file_name, 0, FILE_NAME_MAX_SIZE+1);

strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));

printf("%s\n", file_name);

FILE * fp = fopen(file_name, "rb"); //windows下是"rb",表示打开一个只读的二进制文件

if (NULL == fp)

{

printf("File: %s Not Found\n", file_name);

}

else

{

memset(buffer, 0, BUFFER_SIZE);

int length = 0;

while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)

{

if (send(m_New_Socket, buffer, length, 0) < 0)

{

printf("Send File: %s Failed\n", file_name);

break;

}

memset(buffer, 0, BUFFER_SIZE);

}

fclose(fp);

printf("File: %s Transfer Successful!\n", file_name);

}

closesocket(m_New_Socket);

}

closesocket(m_Socket);

//释放winsock库

WSACleanup();

return 0;

}

Client端代码如下:

/*************************************************************************

> File Name: Win_Client.c

> Author: SongLee

************************************************************************/

#include

#include

#include

#include

#define PORT 8087

#define SERVER_IP "127.0.0.1"

#define BUFFER_SIZE 1024

#define FILE_NAME_MAX_SIZE 512

#pragma comment(lib, "WS2_32")

int main()

{

// 初始化socket dll

WSADATA wsaData;

WORD socketVersion = MAKEWORD(2, 0);

if(WSAStartup(socketVersion, &wsaData) != 0)

{

printf("Init socket dll error!");

exit(1);

}

//创建socket

SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0);

if (SOCKET_ERROR == c_Socket)

{

printf("Create Socket Error!");

system("pause");

exit(1);

}

//指定服务端的地址

sockaddr_in server_addr;

server_addr.sin_family = AF_INET;

server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);

server_addr.sin_port = htons(PORT);

if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)))

{

printf("Can Not Connect To Server IP!\n");

system("pause");

exit(1);

}

//输入文件名

char file_name[FILE_NAME_MAX_SIZE+1];

memset(file_name, 0, FILE_NAME_MAX_SIZE+1);

printf("Please Input File Name On Server: ");

scanf("%s", &file_name);

char buffer[BUFFER_SIZE];

memset(buffer, 0, BUFFER_SIZE);

strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE:strlen(file_name));

//向服务器发送文件名

if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0)

{

printf("Send File Name Failed\n");

system("pause");

exit(1);

}

//打开文件,准备写入

FILE * fp = fopen(file_name, "wb"); //windows下是"wb",表示打开一个只写的二进制文件

if(NULL == fp)

{

printf("File: %s Can Not Open To Write\n", file_name);

system("pause");

exit(1);

}

else

{

memset(buffer, 0, BUFFER_SIZE);

int length = 0;

while ((length = recv(c_Socket, buffer, BUFFER_SIZE, 0)) > 0)

{

if (fwrite(buffer, sizeof(char), length, fp) < length)

{

printf("File: %s Write Failed\n", file_name);

break;

}

memset(buffer, 0, BUFFER_SIZE);

}

printf("Receive File: %s From Server Successful!\n", file_name);

}

fclose(fp);

closesocket(c_Socket);

//释放winsock库

WSACleanup();

system("pause");

return 0;

}

程序中备有较为详尽的注释,相信大家不难理解。感兴趣的朋友可以根据自身需要对程序加以灵活改善,使其功能更加强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值