Windows網(wǎng)絡編程之winsock實現(xiàn)文件傳輸示例
本文實例展示了Windows網(wǎng)絡編程中winsock實現(xiàn)文件傳輸?shù)姆椒ǎ瑢τ谶M行Windows下的winsock網(wǎng)絡編程有一定的借鑒參考價值。
該程序代碼主要是基于TCP流協(xié)議的winsock網(wǎng)絡文件傳輸示例,采用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() { // 聲明并初始化一個服務端(本地)的地址結(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和服務端(本地)地址 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",表示打開一個只讀的二進制文件 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); } //指定服務端的地址 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)); //向服務器發(fā)送文件名 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; }
程序中備有較為詳盡的注釋,相信大家不難理解。感興趣的朋友可以根據(jù)自身需要對程序加以靈活改善,使其功能更加強大。
上一篇:Linux網(wǎng)絡編程之socket文件傳輸示例
欄 目:C語言
本文標題:Windows網(wǎng)絡編程之winsock實現(xiàn)文件傳輸示例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3487.html
您可能感興趣的文章
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10內(nèi)部排序之堆排序的實現(xiàn)詳解
- 01-10進程間通信之深入消息隊列的詳解
- 01-10海量數(shù)據(jù)處理系列之:用C++實現(xiàn)Bitmap算法
- 01-10如何求連續(xù)幾個數(shù)之和的最大值
- 01-10C++算法之海量數(shù)據(jù)處理方法的總結(jié)分析
- 01-10深入理解c++中char*與wchar_t*與string以及wstring之間的相互轉(zhuǎn)換
- 01-10用代碼和UML圖化解設計模式之橋接模式的深入分析
- 01-10C++代碼規(guī)范之命名規(guī)則
- 01-10C語言之free函數(shù)以及野指針介紹


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery