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

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

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

具体实现代码如下:

Server端代码如下:

/*************************************************************************
  > File Name: Win_Server.c
  > Author: SongLee
 ************************************************************************/ 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h> 

#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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h> 

#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;
} 

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索windows
, 网络编程
, 文件传输
winsock
winsock网络编程经络、winsock编程、winsock编程实例、winsock网络编程 pdf、winsock网络编程,以便于您获取更多的相关知识。

时间: 2024-09-19 20:16:23

Windows网络编程之winsock实现文件传输示例_C 语言的相关文章

Linux网络编程之基于UDP实现可靠的文件传输示例_C 语言

了解网络传输协议的人都知道,采用TCP实现文件传输很简单.相对于TCP,由于UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方法就是给数据包编号,按照包的顺序接收并存储,接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送. 下面展示的是基于linux下C语言实现的一个示例程序,该程序定义一个包的结构体,其中

Linux网络编程之socket文件传输示例_C 语言

本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. 具体实现代码如下: Server端代码如下: /************************************************************************* > File Name: Server.c > Author: SongLee ***********

084_《Windows网络编程之Delphi篇》

<Windows网络编程之Delphi篇> Delphi 教程 系列书籍 (084) <Windows网络编程之Delphi篇> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 作者: 萧秋水 文娟 丛书名: 计算机编程系列丛书 出版社:清华大学出版社 ISBN:7900630945 上架时间:2001-2-27 出版日期:2001 年1月 页码:280 版次:1-1 内容简介 Internet技术无疑是当今计算机技术的

C语言实现Linux下的socket文件传输实例_C 语言

本文实例讲述了C语言实现Linux下的socket文件传输.分享给大家供大家参考.具体如下: server.c如下: //////////////////////////////////// //服务器代码 /////////////////////////////////// //本文件是服务器的代码 #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include &

C++ COM编程之QueryInterface函数(一)_C 语言

前言 组件对外公布的是接口:一个组件可以实现多个接口,也就是说可以对外公布多个接口,之前也总结过了,你很少会100%的去完全了解一个组件的所有接口,就像你去学习编程一样,你几乎不可能去成为编程中的全才.那么,既然我们不能去完全的了解一个组件提供的所有接口,那么我们在实际开发中,如何去判断一个组件是否提供对应的接口呢?看文档?是的,是个好主意,在文档的海洋,找到一个知识点,真的很难,浪费时间和精力:其实,组件本身就提供对自己查询的一个接口,让客户去询问组件,问它是否支持某个接口,在经过多次的这种询

C++ COM编程之QueryInterface函数(二)_C 语言

前言 在COM编程--认识组件中也总结了,COM是一个说明如何建立可动态互变组件的规范,它提供了为保证能够互操作,客户和组件应遵循的一些标准.而在实现和使用QueryInterface时,就需要去遵守一些规则,只有遵守了这些规则,才能是一个正确的COM组件:只有了解了这些规则,才能会真正的了解COM开发. QueryInterface的实现规则 实现QueryInterface需要遵从以下五条规则: 1.QueryInterface总是返回同一IUnknown指针 组件的实例只有一个IUnkno

win32使用openfilename浏览文件窗口示例_C 语言

代码如下: 复制代码 代码如下: OPENFILENAME ofn;WCHAR* szFile = new WCHAR[512];WCHAR* szFileTitle = new WCHAR[512];memset(&ofn, 0, sizeof(ofn));memset(szFile, 0, sizeof(WCHAR)*512);memset(szFileTitle, 0, sizeof(WCHAR)*512); ofn.lStructSize = sizeof(ofn);ofn.hwndOw

Linux网络编程之UDP Socket程序示例_C 语言

在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

c语言 socket编程-C语言网络编程之listen函数的实现

问题描述 C语言网络编程之listen函数的实现 请教: listen函数方法实现,函数体是什么 我抄了一段代码为什么执行到listen函数这儿就不往下执行了也不报错