c++ socket學習(1.5)

本文學習相關資料:
C/C++ socket編程教程

環境:vs2015
源碼:本文代碼

這次來試一下使用TCP來傳輸文件,其實傳輸數據和差不多,就是多一個讀取文件,和一個寫文件而已。

服務端

int readlan = 100;
std::ifstream infile;SOCKET client = accept(servSock, (sockaddr*)&clntAddr, &nSize);//獲取
do {//接收獲取的文件名recv(client, buf, maxlen, 0);std::cout << buf << std::endl;//打開文件infile.open(buf, std::ios::binary | std::ios::in);if (infile.is_open()) { //如果打開文件成功就退出,否則繼續等待break;}else {std::cout << "文件打開失敗" << std::endl;send(client, "False", 6, 0);}
} while (1);if (infile.is_open()) {
//打開文件成功,通知客戶端接收文件send(client, "True", 5, 0);std::cout << "準備發送文件" << std::endl;int num = 0;//獲取文件的大小infile.seekg(0, std::ios::end);int length = infile.tellg();//設置文件指針在第一個位置infile.seekg(std::ios::beg);//循環讀取while (length > 0) {std::cout << "正在發送文件,目前還剩余" << length << "字節" << std::endl;memset(&buf, maxlen, 0);//讀取內容,每次讀readlen個字節if (length >= readlen) { length -= readlen;infile.read(buf, readlen);num = readlen;}else {num = length;infile.read(buf, length);length = 0;}//發送內容send(client, buf, num, 0);}
}
else {std::cout << "文件打開失敗,即將關閉" << std::endl;
}
//發送斷開連接信息
shutdown(client, SD_SEND);
//關閉文件和套接字
infile.close();
closesocket(client);

客戶端

std::ofstream f;
std::string fileName;//連接到服務端
connect(client, (sockaddr*)&servAddr, sizeof(sockaddr));
while (1) {memset(buf, maxlen, 0);std::cout << "請輸入要下載的文件名稱:";//輸入文件名稱std::cin >> fileName;send(client, fileName.c_str(), fileName.size() + 1, 0);recv(client, buf, readlen, 0);if (strcmp(buf, "True") == 0) {break;}
}
//打開文件
f.open(fileName.c_str(), std::ios::binary | std::ios::out);
while (1) {int nlen = recv(client, buf, readlen, 0);if (nlen <= 0) {std::cout << "文件接收完畢!" << std::endl;break;}else {//寫入文件f.write(buf, nlen); f.flush();}
}
f.close();
closesocket(client);

可能會注意到這里服務端能接收到連接,是因為調用了listen,但是客戶端沒有listen,服務端是怎么知道要把數據發送到哪里呢?

原來服務端在調用accept的時候,就已經獲取到了客戶端的IP地址端口號,保存在了clntAddr

那么客戶端又沒有bind 又怎么來IP地址端口呢?

簡單地來說是當客戶端調用connect的時候,系統自動分配的,畢竟需要個IP地址端口才能進行3次握手

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376283.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab生成HEX文件-任意信號 大于64K長度

HEX文件格式不贅述&#xff0c;寫里直接放上代碼。請批評改正。 1 %%convert a signal data into hex file format2 % data format:16bit 3 % signal length: less than 2^24-14 % author: Yang Li yangli0534gmail.com5 % data:2015.01.276 7 clear all;8 close all;9 clc; 10…

移動端網頁中ViewPort的使用

<meta name"viewport" content"widthdevice-width,target-densitydpihigh-dpi, initial-scale1.0, minimum-scale1.0, maximum-scale1.0, user-scalableno"> <meta name”viewport” content”widthdevice-width, initial-scale1.0, user-scalabl…

c++ socket學習(1.6)

本文學習相關資料&#xff1a; C/C socket編程教程 環境&#xff1a;vs2015 源碼&#xff1a;本文代碼 這次來看看UDP 之前在c socket學習&#xff08;1.2&#xff09;講過UDP怎么發送了&#xff0c;那現在來做一個可以一直發送的。 這次沒有什么接收端和發送端了&#xff0…

redis學習筆記——(1)

1. NoSQL&Redis介紹 NoSQL&#xff0c;Not Only SQL&#xff0c;是非關系型的數據庫。傳統的關系數據庫不能滿足超大規模和高并發的應用。 是以Key-Value的形式存儲&#xff0c;&#xff08;例如JSON,XML&#xff09;&#xff0c;不一定遵循傳統數據庫的一些基本要求&#…

命令模式堅決svn樹沖突(local unversioned, incoming add upon update)

當工作目錄修改刪除過時更新使用svn更新就容易發生樹沖突“Tree Confilict”.會出現類似提示。 local unversioned, incoming add upon update1local unversioned,incoming add upon update如果使用圖形化客戶端可以通過對比文件和解決沖突按鈕進行解決&#xff0c; 如果是使用…

c++ vector學習

參考資料&#xff1a; cppreference.com 本文代碼&#xff1a; 本文源碼 目錄隱式成員函數1.operator &#xff08;賦值給容器&#xff09;2.assign &#xff08;將值賦給容器&#xff09;元素訪問3.at &#xff08;訪問指定元素&#xff0c;進行下標檢查&#xff09;4.operat…

linux關閉聲音

對于CentOS/Redhat/RHEL/Fedora系統&#xff0c;使用root身份執行&#xff1a;echo "alias pcspkr off" >> /etc/modprobe.conf轉載于:https://www.cnblogs.com/keethebest/p/3434821.html

Bundle Identifier

Bundle Identifier : 產品的唯一標識符 1.在模擬器上面&#xff0c;只能有一個唯一的標識符的應用程序 2.在AppStore上&#xff0c;所有的應用程序的Bundler ID都是唯一的 Bundle ID 公司的反向域名 產品名 Bundle ID 不支持中文&#xff0c;因此如果是上架產品&#xff0c;需…

c++ array學習

參考資料&#xff1a; cppreference.com 本文代碼&#xff1a; 本文源碼 array和vector的區別是array是和C中的數組類似&#xff0c;不能動態改變數組大小&#xff0c;所以會比vector少很多函數。 目錄隱式定義的成員函數1.operator &#xff08;將另一個容器拷貝過來&#x…

lucene4入門(2)搜索

歡迎轉載http://www.cnblogs.com/shizhongtao/p/3440479.html 接著上一篇&#xff0c;這里繼續搜索&#xff0c;對于搜索和創建一樣&#xff0c;首先你要確定搜索位置&#xff0c;然后用規定的類來讀取。還要注意一點&#xff0c;確定分詞器&#xff0c;因為不同的分詞器所創建…

Topcoder SRM 648 (div.2)

第一次做TC全部通過&#xff0c;截圖紀念一下。 終于藍了一次&#xff0c;也是TC上第一次變成藍名&#xff0c;下次就要做Div.1了&#xff0c;希望div1不要掛零。。。_(:зゝ∠)_ A. KitayutaMart2 萬年不變的水題。 #include<cstdio> #include<cstring> #include&…

Kadane's algorithm學習

Kadane’s algorithm 簡單來說就是用來計算數組中的連續子數組之和最大是多少 vector<int> vec; int temp 0,ans 0; for(int i0;i<vec.size();i){temp max(tempvec[i],vec[i]);ans max(temp,ans); } return ans;循環的第一行就是用來比較當前位置的值和前面數組…

好用的ajax后臺框架

dwz 簡單實用的國產jquery Ui框架 http://www.j-ui.com/#_blank轉載于:https://www.cnblogs.com/userbibi/p/3441382.html

OpenFire源碼學習之十九:在openfire中使用redis插件(上)

Redis插件 介紹 Redis是目前比較流行的NO-SQL&#xff0c;基于K,V的數據庫系統。關于它的相關操作信息&#xff0c;本人這里就不做重復了&#xff0c;相關資料可以看這個網站http://www.redis.io/(官網)、http://www.redis.cn/(中文站)。 這里本人想說的是&#xff0c;拿Redis做…

c++ queue學習

參考資料&#xff1a; cppreference.com 本文代碼&#xff1a; 本文源碼 目錄成員函數1.operator &#xff08;賦值給容器&#xff09;元素訪問2.front &#xff08;訪問第一個元素&#xff09;3.back &#xff08;訪問最后一個元素&#xff09;容量4.empty &#xff08;判斷容…

沒有文件擴展“.js”的腳本引擎問題解決

安裝MinGW的時候提示沒有文件擴展“.js”的腳本引擎。原因&#xff1a;系統安裝Dreamwear、UltraEdit、EditPlus后修改了.js文件的默認打開方式。當想直接執行js腳本時就會出現此錯誤。解決辦法&#xff1a;打開注冊表編輯器&#xff0c;定位[HKEY_CLASSES_ROOT.js]這一項&…

160 - 54 eKH

環境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、IDA 3、exeinfo 查殼發現是程序無殼且用Delphi語言編寫 可以通過搜索字符串的方式定位關鍵函數地址 這里定位到是 00427B44ReadInput(a2, &v17); // 讀取輸入的usernameif ( StrL…

點賺接口(第二版)

1.查看是否有新消息 url&#xff1a;/get/message/status?user_id{user_id} method&#xff1a;get response&#xff1a; {"code": "ok","msg": "","data": 0 //新消息數目 } 2.獲取消息列表 url&#xff1a;/get/messa…

Java基礎之線程——使用Runnable接口(JumbleNames)

控制臺程序。 除了定義Thread新的子類外&#xff0c;還可以在類中實現Runnable接口。您會發現這比從Thread類派生子類更方便&#xff0c;因為在實現Runnable接口時可以從不是Thread的類派生子類&#xff0c;并且仍然表示線程。Java只允許有單個基類&#xff0c;如果類派生于Thr…

cpri帶寬不足的解決方法_白皮書:FPGA賦能下一代通信和網絡解決方案(第四部分)...

對PCIe Gen 5的支持除了以太網和存儲控制器&#xff0c;Speedster7t FPGA上提供的對PCIe Gen 5的支持還能夠與主機處理器緊密集成&#xff0c;以支持諸如sidecar智能網卡(SmartNIC)設計等高性能加速器應用。PCI Gen 5控制器使其能夠讀取和寫入存儲在FPGA內存層級結構中的數據&a…