国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

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

圖片精選

主站蜘蛛池模板: 庆安县| 江源县| 镇远县| 合阳县| 金乡县| 新宁县| 合肥市| 忻城县| 军事| 黄梅县| 麻城市| 宕昌县| 陆河县| 乡宁县| 辽源市| 泰州市| 珲春市| 乌拉特后旗| 辛集市| 鄂尔多斯市| 遂平县| 汤阴县| 聂拉木县| 甘谷县| 娄底市| 乌恰县| 易门县| 冕宁县| 伊通| 阆中市| 什邡市| 塘沽区| 札达县| 金湖县| 长岭县| 古蔺县| 施甸县| 永平县| 岳西县| 平昌县| 环江|