Windows網路編程之winsock實現檔案傳輸樣本_C 語言

來源:互聯網
上載者:User

本文執行個體展示了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; } 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.