C++网络编程——收发一个快递
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++网络编程——收发一个快递相关的知识,希望对你有一定的参考价值。
从事网络方面的开发有一段时间了,每天在各种琐碎的事情中奔波,对我这种野路子出身的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++网络编程——收发一个快递的主要内容,如果未能解决你的问题,请参考以下文章