最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Windows網(wǎng)絡(luò)編程之winsock實現(xiàn)文件傳輸示例

 更新時間:2014年08月14日 15:12:53   投稿:shichen2014  
這篇文章主要介紹了Windows網(wǎng)絡(luò)編程之winsock實現(xiàn)文件傳輸示例,對于學(xué)習(xí)Windows網(wǎng)絡(luò)程序設(shè)計來說具有很好的學(xué)習(xí)借鑒價值,需要的朋友可以參考下

本文實例展示了Windows網(wǎng)絡(luò)編程中winsock實現(xiàn)文件傳輸?shù)姆椒ǎ瑢τ谶M(jìn)行Windows下的winsock網(wǎng)絡(luò)編程有一定的借鑒參考價值。

該程序代碼主要是基于TCP流協(xié)議的winsock網(wǎng)絡(luò)文件傳輸示例,采用Windows下的C語言編寫??梢詫崿F(xiàn)傳遞任何格式文件的文件傳輸功能。

具體實現(xiàn)代碼如下:

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() 
{ 
  // 聲明并初始化一個服務(wù)端(本地)的地址結(jié)構(gòu) 
  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); 
  } 
 
  // 創(chuàng)建socket 
  SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0); 
    if (SOCKET_ERROR == m_Socket) 
    { 
      printf("Create Socket Error!"); 
    exit(1); 
    } 
 
  //綁定socket和服務(wù)端(本地)地址 
  if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr))) 
  { 
    printf("Server Bind Failed: %d", WSAGetLastError()); 
    exit(1); 
  } 
 
  //監(jiān)聽 
  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",表示打開一個只讀的二進(jìn)制文件 
    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); 
  } 
 
  //創(chuàng)建socket 
  SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0); 
  if (SOCKET_ERROR == c_Socket) 
  { 
    printf("Create Socket Error!"); 
    system("pause"); 
    exit(1); 
  } 
 
  //指定服務(wù)端的地址 
  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)); 
 
  //向服務(wù)器發(fā)送文件名 
  if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0) 
  { 
    printf("Send File Name Failed\n"); 
    system("pause"); 
    exit(1); 
  } 
 
  //打開文件,準(zhǔn)備寫入 
  FILE * fp = fopen(file_name, "wb"); //windows下是"wb",表示打開一個只寫的二進(jìn)制文件 
  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; 
} 

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

相關(guān)文章

  • C++實現(xiàn)簡單貪吃蛇游戲

    C++實現(xiàn)簡單貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C語言實現(xiàn)簡易通訊錄完整流程

    C語言實現(xiàn)簡易通訊錄完整流程

    這篇文章主要為大家介紹了C語言實現(xiàn)簡易通訊錄的完整流程,每個環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • C++實現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索)

    C++實現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(33.在旋轉(zhuǎn)有序數(shù)組中搜索),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?opencv利用grabCut算法實現(xiàn)摳圖示例

    C++?opencv利用grabCut算法實現(xiàn)摳圖示例

    這篇文章主要為大家介紹了C++?opencv利用grabCut算法實現(xiàn)摳圖的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Windows上使用vs編譯fdk-aac的教程詳解

    Windows上使用vs編譯fdk-aac的教程詳解

    有時需要在Windows上用到fdk-aac,fdk-aac是源碼是cmake的,可以直接轉(zhuǎn)成vs項目,下面就跟隨小編一起學(xué)習(xí)一下如何在Windows上使用vs編譯fdk-aac吧
    2023-11-11
  • C++簡單五子棋的AI設(shè)計實現(xiàn)

    C++簡單五子棋的AI設(shè)計實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C++簡單五子棋的AI設(shè)計實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Opencv二幀差法檢測運動目標(biāo)與提取輪廓

    Opencv二幀差法檢測運動目標(biāo)與提取輪廓

    這篇文章主要為大家詳細(xì)介紹了Opencv使用二幀差法檢測運動目標(biāo)與提取輪廓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Qt實現(xiàn)圖片移動實例(圖文教程)

    Qt實現(xiàn)圖片移動實例(圖文教程)

    這學(xué)期實訓(xùn)的時候用MFC做過一個飛機(jī)大戰(zhàn),很無聊的東西,一直想用Qt做一個;首先需要解決的問題是圖片的移動,怎么說飛機(jī)啊子彈啊都是動著的,圖片當(dāng)然要跑起來,感興趣的你可不要走開啊
    2013-01-01
  • c++之移動構(gòu)造函數(shù)或者移動賦值運算符的作用詳解

    c++之移動構(gòu)造函數(shù)或者移動賦值運算符的作用詳解

    文章介紹了移動構(gòu)造函數(shù)和移動賦值運算符的核心作用,它們通過資源管理權(quán)轉(zhuǎn)移的方式實現(xiàn)對象的構(gòu)造,減少內(nèi)存拷貝的開銷,移動構(gòu)造函數(shù)的參數(shù)一定是一個右值引用
    2025-03-03
  • 詳細(xì)了解C語言二叉樹的建立與遍歷

    詳細(xì)了解C語言二叉樹的建立與遍歷

    這篇文章主要介紹了C中二叉樹的建立和各種遍歷實例代碼,涉及樹節(jié)點的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下
    2021-07-07

最新評論

瓮安县| 平乡县| 湟源县| 涟水县| 凤凰县| 临西县| 黄山市| 临夏市| 达州市| 田阳县| 海晏县| 阿勒泰市| 湟源县| 稷山县| 蚌埠市| 胶州市| 辽源市| 微山县| 灵石县| 和平县| 晋宁县| 融水| 咸丰县| 得荣县| 晋江市| 本溪| 尼勒克县| 天全县| 永胜县| 开平市| 汕头市| 龙山县| 抚松县| 临潭县| 香港| 淮滨县| 扶风县| 静海县| 靖州| 西盟| 澄江县|