首页 > 编程 > C > 正文

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

2020-01-26 15:24:23
字体:
来源:转载
供稿:网友

本文实例展示了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; } 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选