a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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; } 

程序中備有較為詳盡的注釋,相信大家不難理解。感興趣的朋友可以根據自身需要對程序加以靈活改善,使其功能更加強大。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 国产视频亚洲精品 | 久草成人| 日韩精品一区二区三区免费视频 | av在线免费观看一区二区 | 夜夜躁狠狠躁夜躁2021鲁大师 | 人人干在线视频 | 亚洲精品www | www.一区二区三区 | 欧美在线网站 | 先锋影音av资源站 | 久久av黄色| 免费99精品国产自在在线 | www.精品 | 羞羞网站在线观看 | 亚洲精品久久久久久一区二区 | 欧美怡红院视频一区二区三区 | 久久国产精品免费一区二区三区 | 韩国精品 | 欧美一区二区三区视频在线观看 | a级性视频 | 日韩中文字 | 伊人一二三区 | 亚洲一级毛片 | 日韩精品一区二区三区中文字幕 | 欧美爱爱视频 | 毛片久久久 | 亚洲精色 | 国产九九精品 | 国产精品久久久久久久7电影 | 国产精品久久婷婷六月丁香 | 亚洲乱码一区二区三区在线观看 | 日韩在线免费 | 久久久久久一区二区 | 国产99久 | 亚洲+变态+欧美+另类+精品 | 国产区一区 | 亚洲日韩视频免费观看 | 国产精品99| 欧美国产视频 | 成人av电影免费观看 | 99热99|