106.TCP传文件

  • 客户端
     1 #define  _CRT_SECURE_NO_WARNINGS
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <winsock.h>
     5 #include <string.h>
     6 #pragma  comment(lib,"ws2_32.lib")
     7 
     8 //定义端口
     9 #define PORT 6666
    10 //缓冲区大小
    11 #define BUF_SIZE 1024
    12 //文件名大小
    13 #define FILENAMESIZE  512
    14 //本地地址
    15 #define SIP "192.168.1.108"
    16 
    17 //主函数
    18 void main()
    19 {
    20     //用于初始化网络
    21     WSADATA wsadata;
    22     //定义版本
    23     WORD socketversion = MAKEWORD(2, 2);
    24     //初始化网络
    25     if (WSAStartup(socketversion,&wsadata)!=0)
    26     {
    27         printf("网络初始化失败");
    28         return;
    29     }
    30     //创建TCP通信
    31     SOCKET  client_socket = socket(AF_INET, SOCK_STREAM, 0);
    32     //判断是否创建成功
    33     if (client_socket==SOCKET_ERROR)
    34     {
    35         printf("网络创建通信socket出错");
    36         return;
    37     }
    38     //设定服务器信息
    39     SOCKADDR_IN sever_addr;
    40     sever_addr.sin_family = AF_INET;
    41     sever_addr.sin_addr.S_un.S_addr = inet_addr(SIP);
    42     //设定IP,端口
    43     sever_addr.sin_port = htons(PORT);
    44     //连接到服务器
    45     if (connect(client_socket, (SOCKADDR*)&sever_addr, sizeof(sever_addr)) == SOCKET_ERROR)
    46     {
    47         puts("连接错误");
    48         return;
    49     }
    50     char filename[512] = { 0 };
    51     //初始化
    52     scanf("%s", filename);
    53 
    54     char buffer[1024] = { 0 };
    55     memset(buffer, 0, 1024);
    56     strcpy(buffer, filename);
    57 
    58     //传递文件名,请求下载
    59     if (send(client_socket,buffer,1024,0) <0)//传输出错
    60     {
    61         puts("传输错误");
    62         return;
    63     }
    64 
    65     //写文件
    66     FILE *pf= fopen(filename, "wb");
    67     if (pf==NULL)
    68     {
    69         puts("文件打开失败");
    70         return;
    71 
    72 
    73     }
    74     else
    75     {
    76         memset(buffer, 0, 1024);
    77         int length = 0;
    78         printf("文件开始传输");
    79         //不断接收
    80         while ((length=recv(client_socket,buffer,1024,0))>0)
    81         {
    82             if (fwrite(buffer,sizeof(char),length,pf)<length)
    83             {
    84                 puts("文件传输错误");
    85             }
    86             memset(buffer, 0, 1024);
    87         }
    88         printf("文件传输成功");
    89         system("pause");
    90         system(filename);
    91     }
    92     //关闭文件网络,清理网络
    93     fclose(pf);
    94     closesocket(client_socket);
    95     WSACleanup();
    96 }
  • 服务器端
      1 #define  _CRT_SECURE_NO_WARNINGS
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <winsock.h>
      5 #include <string.h>
      6 #pragma  comment(lib,"ws2_32.lib")
      7 
      8 #define PORT 6666
      9 #define BUF_SIZE 1024
     10 #define FILENAMESIZE  512
     11 #define SIP "169.254.29.232"
     12 
     13 void main()
     14 {
     15     //初始化服务器ip地址与端口号并定义谁可以连接
     16     SOCKADDR_IN server_addr;
     17     server_addr.sin_family = AF_INET;
     18     server_addr.sin_port = htons(PORT);
     19     //本地ip地址
     20     server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
     21     WSADATA wsadata;
     22     WORD socketversion = MAKEWORD(2, 2);//定义版本
     23     if (WSAStartup(socketversion, &wsadata) != 0)
     24     {
     25         printf("网络初始化失败");
     26         return;
     27     }
     28     //创建
     29     SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);//创建
     30     if (server_socket == SOCKET_ERROR)
     31     {
     32         printf("网络创建通信socket出错");
     33         return;
     34     }
     35     //绑定
     36     if (SOCKET_ERROR == bind(server_socket,(SOCKADDR*) &server_addr, sizeof(server_addr)))
     37     {
     38         printf("bind 出错");
     39         return;
     40     }
     41     //监听
     42     if (SOCKET_ERROR == listen(server_socket,10))
     43     {
     44         printf("listen 出错");
     45         return;
     46     }
     47     //传文件
     48 
     49     while (1)
     50     {
     51         printf("进入listen,开始等待客户端");
     52         //客户端地址
     53         SOCKADDR_IN client_addr;
     54         int clientlength = sizeof(client_addr);
     55         //接收连接
     56         SOCKET new_socket = accept(server_socket, (SOCKADDR*)&client_addr, &clientlength);
     57         if (SOCKET_ERROR == new_socket)
     58         {
     59             printf("服务器已经满或者链接失败");
     60             break;
     61         }
     62         char buffer[1024] = { 0 };
     63         char filename[512] = { 0 };
     64         //接收信息
     65         if (recv(new_socket,buffer,1024,0)<0)
     66         {
     67             printf("收取文件名失败");
     68             break;
     69         }
     70         strcpy(filename, buffer);
     71         
     72         //以二进制方式读取
     73         FILE *pf = fopen(filename, "rb");
     74         if (pf == NULL)
     75         {
     76             printf("文件打开失败");
     77             break;
     78         } 
     79         else
     80         {
     81             memset(buffer, 0, 1024);//清零
     82             int recelength = 0;
     83             while ((recelength = fread(buffer, sizeof(char), 1024, pf)>0))
     84             {
     85                 if (send(new_socket,buffer,1024,0)<0)
     86                 {
     87                     printf("文件传输失败");
     88                     break;
     89                 }
     90                 memset(buffer, 0, 1024);//清零
     91             }
     92             fclose(pf);
     93             printf("传输完成");
     94 
     95         }
     96 
     97         closesocket(new_socket);
     98     }
     99     closesocket(server_socket);
    100     system("pause");
    101     WSACleanup();
    102 }
原文地址:https://www.cnblogs.com/xiaochi/p/8494910.html