日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ socket学习(1.5)

發(fā)布時間:2023/12/1 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ socket学习(1.5) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文學(xué)習相關(guān)資料:
C/C++ socket編程教程

環(huán)境:vs2015
源碼:本文代碼

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

服務(wù)端

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()) { //如果打開文件成功就退出,否則繼續(xù)等待break;}else {std::cout << "文件打開失敗" << std::endl;send(client, "False", 6, 0);} } while (1);if (infile.is_open()) { //打開文件成功,通知客戶端接收文件send(client, "True", 5, 0);std::cout << "準備發(fā)送文件" << std::endl;int num = 0;//獲取文件的大小infile.seekg(0, std::ios::end);int length = infile.tellg();//設(shè)置文件指針在第一個位置infile.seekg(std::ios::beg);//循環(huán)讀取while (length > 0) {std::cout << "正在發(fā)送文件,目前還剩余" << length << "字節(jié)" << std::endl;memset(&buf, maxlen, 0);//讀取內(nèi)容,每次讀readlen個字節(jié)if (length >= readlen) { length -= readlen;infile.read(buf, readlen);num = readlen;}else {num = length;infile.read(buf, length);length = 0;}//發(fā)送內(nèi)容send(client, buf, num, 0);} } else {std::cout << "文件打開失敗,即將關(guān)閉" << std::endl; } //發(fā)送斷開連接信息 shutdown(client, SD_SEND); //關(guān)閉文件和套接字 infile.close(); closesocket(client);

客戶端

std::ofstream f; std::string fileName;//連接到服務(wù)端 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);

可能會注意到這里服務(wù)端能接收到連接,是因為調(diào)用了listen,但是客戶端沒有listen,服務(wù)端是怎么知道要把數(shù)據(jù)發(fā)送到哪里呢?

原來服務(wù)端在調(diào)用accept的時候,就已經(jīng)獲取到了客戶端的IP地址端口號,保存在了clntAddr。

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

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的c++ socket学习(1.5)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。