C++網絡編程(1)——收發一個快遞
阿新 • • 發佈:2017-07-16
無法 system initial blog 每天 span comm char 出身
從事網絡方面的開發有一段時間了,每天在各種瑣碎的事情中奔波,對我這種野路子出身的C++程序員,感覺總是欠缺點什麽。
終於,思量再三,準備結束這繁雜卻無法前進寸步的工作,也暫時給自己一些時間,梳理一下自己摸索網絡開發的一些東西,從簡單到復雜,一步一步的進階。希望能讓自己更進一步,也希望能幫助一些和我當年一樣懵逼的同行們,堅持就是勝利!
下面來看一個簡單的示例:
server.cpp
#include <iostream> #include <WinSock2.h> using namespace std; #pragma comment(lib,"ws2_32.lib") //初始化Socket資源 int Initialization() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2),&wsaData) != NO_ERROR) { cout << "初始化失敗!" << endl; return 0; } return 1; } int main() { if (Initialization() == 0) { return 0; } SOCKET sockSvr; SOCKADDR_IN addrSvr;//收發快遞,要保證我們有一個收件人 sockSvr = socket(AF_INET, SOCK_STREAM, 0); //收件人可以選擇接受哪個地區發來的快遞 addrSvr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //收件人可以選擇接受哪種方式發來的快遞(udp/tcp) addrSvr.sin_family = AF_INET; //收件人有一個固定的房間(端口)收取快遞 addrSvr.sin_port = htons(6000); //將收件人的各種信息告知快遞商 bind(sockSvr, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR)); //快遞商留意收件人的快遞 listen(sockSvr, 5); std::cout << "激動的等待遠方朋友的快遞..." << std::endl; int nLen = sizeof(SOCKADDR); char cSendBuf[128] = { 0 }; char cRecvBuf[128] = { 0 }; SOCKADDR_IN addrClient; //當有快遞到來,快遞商將包裹保存於特定的位置 SOCKET sockClient = accept(sockSvr, (SOCKADDR*)&addrClient, &nLen); //收件人從這個位置取到自己的包裹 int nRecvLen = recv(sockClient, cRecvBuf, 128, 0); cout << "開心的取到了包裹:" << cRecvBuf << endl; memcpy(cSendBuf, cRecvBuf, strlen(cRecvBuf) + 1); //收件人根據寄件信息,回復 send(sockClient, cSendBuf, strlen(cSendBuf) + 1, 0); closesocket(sockClient); WSACleanup(); system("pause"); return 0; }
client.cpp
#include <iostream> #include <WinSock2.h> using namespace std; #pragma comment(lib,"ws2_32.lib") //初始化Socket資源 int Initialization() { WSADATA wsaData; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != NO_ERROR) { cout << "初始化失敗!" << endl; return 0; } return 1; } int main() { if (Initialization() == 0) { return 0; } SOCKET sockClient; SOCKADDR_IN addrSvr; //收發快遞同樣需要一個寄件人 sockClient = socket(AF_INET, SOCK_STREAM, 0); //寄件人需要知道收件人的地址 addrSvr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //寄件人需要知道收件人收取什麽郵寄方式的快遞 addrSvr.sin_family = AF_INET; //寄件人需要知道收件人在哪個房間收取快遞 addrSvr.sin_port = htons(6000); //快遞商通過寄件人給的信息,檢查是否有誤 if (connect(sockClient, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR)) == SOCKET_ERROR) { return 0; } char cSendBuf[128] = "Hello!"; //將快遞根據收件人信息發送出去 send(sockClient, cSendBuf, strlen(cSendBuf) + 1, 0); char cRecvBuf[128] = { 0 }; recv(sockClient, cRecvBuf, 128, 0); cout << cRecvBuf << endl; system("pause"); return 0; }
示例中,描述了socket網絡編程基本的實現方式,從使用wsastartup選擇需要的socket版本,到socket的創建、地址和端口的選擇、協議的確定、接收和發送函數等等。
後續的文章,將對此逐一進行詳細的講解。
C++網絡編程(1)——收發一個快遞