c++ socket學習(1.1)

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

環境:vs2015
源碼:本文代碼

windows 如何創建客戶端與服務端通信?

TCP:

服務端

windows先告訴程序我們要使用哪個版本的winsock,成功調用了它才能繼續下去

#pragma comment (lib,"ws2_32.lib")  //連接ws2_32.lib
/*
MAKEWORD(2,2)表示使用2.2版本的
WSA:Windows Socket API
Startup:啟動
*/
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata)

然后是創建一個套接字:

/*
這樣就創建了一個套接字了
PF_INET:表示使用ipv4
SOCK_STREAM:表示使用面向連接的數據傳輸方式
IPROTO_TCP:表示使用TCP協議
*/
SOCKET servSock = SOCKET(PF_INET,SOCK_STREAM, IPPROTO_TCP);

然后創建sockaddr_in,用來將上面socketip地址端口綁定

/*
sockaddr_in 是一個結構體
sin_family:使用了ipv4地址
sin_addr.s_add:要綁定的ip地址
sin_port:要綁定的端口inet_addr():將ip地址從字符串轉為整數,每個32位的ip地址都有一個對應的整數
htons():將整型變量從主機字節順序轉變成網絡字節順序
每臺電腦可能由于系統或配置差異導致字節順序不同,這時大家協商好網絡字節的順序,
在通信前先將自己的字節順序轉成網絡字節順序,再發送;
在接受到信息后再轉回自己的字節順序。*/
sockaddr_in servAddr; 
servAddr.sin_family = AF_INET;
//servAddr.sin_addr.s_add = inet_addr("127.0.0.1");
//要使用inet_pton需要包括頭文件:WS2tcpip.h
//這里使用inet_pton來填寫IP地址的原因是vs2015整天告訴我說inet_addr不安全
inet_pton(AF_INET,"127.0.0.1", &sockAddr.sin_addr.s_addr); //說明要監聽的ip地址servAddr.sin_port = htons(9000);/*
這里第二個參數是SOCKADDR*類型的,結構和sockaddr_in類似
*///綁定
bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));

現在將端口IP地址都綁定好了,可以開始監聽有沒有人要連接這個端口

/*
第一個參數表示用來監聽的套接字
第二個參數表示隊列長度,來訪問的人都在這個隊列里面,等待接收
*/listen(servSock,20);

現在有客戶端發來連接請求了,要怎么接受連接呢

/*
accept 取出隊列的第一個連接請求
第一個參數:在listen的那個socket
第二個參數:客戶端的IP地址和端口
第三個參數:SOCKADDR的大小*/
int nSize = sizeof(SOCKADDR);
socketaddr_in clnAddr;
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize)

那現在成功接受請求了,那么要怎么接收發送的數據呢?

/*
recv 接收客戶端發來的數據,默認是阻塞的(也就是程序會一直等到客戶端發信息來,否則不會往下執行)
第一個參數:accept時候返回的套接字
第二個參數:數據保存的地方
第三個參數:讀取數據的最大長度(字節)
返回值:實際讀取了多少個字節的數據
*/
int maxlen = 200;
char buf[maxlen]
int len = recv(clntSock, buf, maxlen, 0)

好了現在服務端接收到關閉的信息了,要怎么關閉呢

/*
記得都要關閉哦
CleanUp:清理
*/
closesocket(clntSock);
closesocket(servSock);
WSACleanup();

客戶端

前面和服務端類似,都是需要創建套接字,說明服務端IP地址端口
記得在這前面要說明使用的socket 版本哦

SOCKET client = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(sockaddr_in));
servAddr.sin_family = PF_INET;
//servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
inet_pton(AF_INET,"127.0.0.1", &servAddr.sin_addr.s_addr); //說明要監聽的ip地址
servAddr.sin_port = htons(9000);

然后可以開始連接了

/*
這個和bind函數類似,只不過那個是綁定,這個連接,連接成功是返回0,否則返回-1
*/
connect(client, (sockaddr*)&servAddr, sizeof(sockaddr_in));

好的,現在客戶端連接上了,是時候發送信息過去了

/*
send
第一個參數:連接成功的那個套接字
第二個參數:發送的內容
第三個參數:發送的內容長度
第四個參數:??
*/
send(client,"Hello Server",13,0);

好了,信息發過去了,我這邊也要關閉了

closesocket(client);
WSACleanup();

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

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

相關文章

c++ socket學習(1.2)

本文學習相關資料: C/C socket編程教程 環境:vs2015 源碼:本文代碼 windows 如何創建客戶端與服務端通信? UDP: 這次就沒什么客戶端服務端好說了,UDP是沒有無連接的 所以改叫接收端和發送端吧 接收端 …

js高級功能與高級需求、高級期待

http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html 簡單練習題:http://tieba.baidu.com/p/2189347922 ---------------------- scope鏈 閉包 Javascript屬性prototype node.js metaprogramming AMD、CMD機制 http://www.makumo.com/js-modules-amd-c…

synchronized同步鎖

在多線程的情況下,由于同一進程的多個線程共享同一片存儲空間,在帶來方便的同時,也帶來了訪問沖突這個嚴重的問題。Java語言提供了專門機制以解決這種沖突,有效避免了同一個數據對象被多個線程同時訪問。由于我們可以通過 private…

c++ socket學習(1.3)

本文學習相關資料: C/C socket編程教程 環境:vs2015 源碼:本文代碼 在這里c socket學習(1.1)學到了怎么樣建立TCP,然后通過TCP連接發送、接收信息。 但是都是一次性的,當時是接收信息后就結束…

一個一線城市的IT白領的生活成本:3萬/年

自從大學畢業,經濟獨立,就開始全面統計各種生活開支。仔細的去統計下,發現開銷還是挺大的。 定理:開銷越大,就意味著你每個月的收入必須越高。 三族鼎立節余族: 收入-開支 > 0月光族:收入-開支 0透支族…

android 編譯共享ccache的緩存

1. android自帶的ccache版本號(2.4版本號)過低,是無法支持以上的功能的,須要使用新版ccache。2. 最新的ccache請到http://ccache.samba.org/download.html下載3. 下載解壓之后,在linux底下進入ccache文件夾,執行:./configure./mak…

一位軟件工程師的6年總結

作者:成曉旭 “又是一年畢業時”,看到一批批學子離開人生的象牙塔,走上各自的工作崗位;想想自己也曾經意氣風發、躊躇滿志,不覺感嘆萬千……本文是自己工作6年的經 歷沉淀或者經驗提煉,希望對所有的軟件工…

c++ socket學習(1.4)

本文學習相關資料: C/C socket編程教程 環境:vs2015 源碼:本文代碼 前面學到了TCP怎么循環發包,但是TCP連接的話會出現一個問題粘包。 TCP連接接收到的數據并不是馬上讀取到內存里面的,而是放在緩沖區,讓…

mongodb中分頁顯示數據集的學習

mongodb中分頁顯示數據集的學習 這次繼續看mongodb中的分頁。首先依然是插入數據: 1) db.Blog.insert( { name : "Denis", age : 20, city : "Princeton" } ) db.Blog.insert( { name : "Abe", age : 30, city : &quo…

學習編程,英語很重要!!

學會編程,可能不需要英語多好,但是學號編程,英語真的很重要!!! 好多文檔,demo全是英文的,蛋疼,應許需要學習!!!轉載于:https://www.cn…

c++ socket學習(1.5)

本文學習相關資料: C/C socket編程教程 環境:vs2015 源碼:本文代碼 這次來試一下使用TCP來傳輸文件,其實傳輸數據和差不多,就是多一個讀取文件,和一個寫文件而已。 服務端 int readlan 100; std::ifst…

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

HEX文件格式不贅述,寫里直接放上代碼。請批評改正。 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…