Socket代碼實現服務端 和 客戶端之間通信

服務端代碼

// Socket_connection.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。
//
#ifndef UNICODE
#define UNICODE
#endif#define WIN32_LEAN_AND_MEAN#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <iostream>#define DEFAULT_BUFLEN 512
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")using namespace std;void main()
{//Initialze winsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){std::cout << "Can't Initialize winsock!Quiting!" << std::endl;;return;}//Creste a sockrtSOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);if (sockSrv == INVALID_SOCKET) {wprintf(L"Can't create a socket with error %d\n", WSAGetLastError());WSACleanup();return;}//Bind the socket to an ip address and portint port = 5099;SOCKADDR_IN addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(port); //1024以上的端口號addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//Bind the socketint retVal = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));if (retVal == SOCKET_ERROR) {printf("Failed bind:%d\n", WSAGetLastError());closesocket(sockSrv);WSACleanup();return;}else {std::cout << "Bind returned success" << std::endl;}//Tell winsock the socket is for listeningif (listen(sockSrv, SOMAXCONN) == SOCKET_ERROR) {printf("Listen failed:%d", WSAGetLastError());return;}//wait for a connectionSOCKADDR_IN addrClient;int clientSize = sizeof(addrClient);SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &clientSize);if (sockConn == SOCKET_ERROR) {wprintf(L"accept failed with error: %ld\n", WSAGetLastError());closesocket(sockSrv);WSACleanup();return;}char host[NI_MAXHOST];       //Client's remote namechar service[NI_MAXSERV];    //Service (i.e. port)the client is connect onZeroMemory(host, NI_MAXHOST);//Same as memset(host,0,NI_MAXHOST)ZeroMemory(service, NI_MAXSERV);if (getnameinfo((sockaddr*)&addrClient, sizeof(addrClient), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {std::cout << "connect on port " << service << std::endl;}else {inet_ntop(AF_INET, &addrClient.sin_addr, host, NI_MAXHOST);std::cout << host << " connect on port " << ntohs(addrClient.sin_port) << std::endl;}//while loop:accept and echo message back to clientchar recvbuf[DEFAULT_BUFLEN] = "";int recvbuflen = DEFAULT_BUFLEN;memset(recvbuf, 0, sizeof(recvbuf));char sendbuf[] = "Client: sending data test\n";retVal = send(sockConn, sendbuf, sizeof(sendbuf), 0);if (retVal == SOCKET_ERROR) {wprintf(L"send failed with error: %d\n", WSAGetLastError());closesocket(sockSrv);WSACleanup();return;}do {retVal = recv(sockConn, recvbuf, recvbuflen, 0);if (retVal > 0) {wprintf(L"Bytes received: %d\n", retVal);printf("%s\n", recvbuf);}else if (retVal == 0)wprintf(L"Connection closed\n");elsewprintf(L"recv failed with error: %d\n", WSAGetLastError());} while (retVal > 0);closesocket(sockConn);//close socketclosesocket(sockSrv);//close winsockWSACleanup();system("pause");
}// 運行程序: Ctrl + F5 或調試 >“開始執行(不調試)”菜單
// 調試程序: F5 或調試 >“開始調試”菜單// 入門使用技巧: 
//   1. 使用解決方案資源管理器窗口添加/管理文件
//   2. 使用團隊資源管理器窗口連接到源代碼管理
//   3. 使用輸出窗口查看生成輸出和其他消息
//   4. 使用錯誤列表窗口查看錯誤
//   5. 轉到“項目”>“添加新項”以創建新的代碼文件,或轉到“項目”>“添加現有項”以將現有代碼文件添加到項目
//   6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”并選擇 .sln 文件

客戶端代碼

// socket_client.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。
//
#ifndef UNICODE
#define UNICODE
#endif#define WIN32_LEAN_AND_MEAN#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <iostream>
#include <string>// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")using namespace std;void main()
{//Initialze winsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){std::cout << "Can't Initialize winsock!Quiting!" << std::endl;;return;}//Creste a sockrtSOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);if (sockClient == INVALID_SOCKET) {wprintf(L"Can't create a socket with error %d\n", WSAGetLastError());WSACleanup();return;}//Bind the socket to an ip address and portint port = 5099;SOCKADDR_IN addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(5099);//addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");inet_pton(AF_INET, "127.0.0.1",&addrSrv.sin_addr.S_un.S_addr);char buff[1024];memset(buff, 0, sizeof(buff));//向服務器發出連接請求if (connect(sockClient, (struct  sockaddr*) & addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {printf("Connect failed:%d", WSAGetLastError());return;}else{//接收數據recv(sockClient, buff, sizeof(buff), 0);printf("%s\n", buff);}//發送數據//const char* buffSend = "hello, this is a Client....";//send(sockClient, buffSend, strlen(buffSend) + 1, 0);char sendbuf[BUFSIZ];std::cout << "Use quit to exit!\n";while (true) {std::cout << "Please input a string to send:";std::string str;getline(std::cin, str);if (str == "quit") {break;}ZeroMemory(sendbuf, BUFSIZ);strcpy_s(sendbuf, str.c_str());if (send(sockClient, sendbuf, strlen(sendbuf) + 1, 0) == SOCKET_ERROR) {wprintf(L"send failed with error: %d\n", WSAGetLastError());closesocket(sockClient);WSACleanup();break;}}//printf("%d", strlen(buffSend) + 1);//關閉套接字closesocket(sockClient);WSACleanup();system("pause");
}// 運行程序: Ctrl + F5 或調試 >“開始執行(不調試)”菜單
// 調試程序: F5 或調試 >“開始調試”菜單// 入門使用技巧: 
//   1. 使用解決方案資源管理器窗口添加/管理文件
//   2. 使用團隊資源管理器窗口連接到源代碼管理
//   3. 使用輸出窗口查看生成輸出和其他消息
//   4. 使用錯誤列表窗口查看錯誤
//   5. 轉到“項目”>“添加新項”以創建新的代碼文件,或轉到“項目”>“添加現有項”以將現有代碼文件添加到項目
//   6. 將來,若要再次打開此項目,請轉到“文件”>“打開”>“項目”并選擇 .sln 文件

演示結果

  • 服務端

  • ?客戶端

參考鏈接

  • inet_pton()和inet_ntop()函數詳解_夕小瑤的賣萌屋-CSDN博客_inet_pton
  • Programming reference for the Win32 API - Win32 apps | Microsoft Docs? 查詢函數的具體內容,適用于微軟函數接口
  • 問題解決:無法解析的外部符號 _imp_XXXXXXXXX - 程序員大本營
  • 常用socket函數詳解_G_BrightBoy的專欄-CSDN博客_socket函數參數詳解
  • windows socket編程實現兩臺電腦間的通信_key_z的博客-CSDN博客_socket通信兩臺電腦之間
  • c++ 網絡編程(一)TCP/UDP windows/linux 下入門級socket通信 客戶端與服務端交互代碼 - aircraft - 博客園
  • 使用VS2019創建項目,添加文件和庫地址_CHYabc123456hh的博客-CSDN博客_vs怎么添加庫文件

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

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

相關文章

python綜合管理系統_Python-20 (信息系統-框架/循環/增刪/綜合應用)

# 1. 目標 這里我們通過簡單案例的綜合應用&#xff0c;了解框架的概念&#xff0c;感受循環、字符字典數據處理等基礎點的應用場景 # 2. 框架 搭建一個人員信息管理系統的簡單框架&#xff0c;初步感受框架的概念。 1> 主程序 -- cards_mian.py程序的主功能代碼&…

本地搭建server和客戶端使用端口進行數據通信,使用Wireshark抓取127.0.0.1環回地址并分析通信數據

本地搭建服務端和客戶端 參考網址 Socket代碼實現服務端 和 客戶端之間通信_CHYabc123456hh的博客-CSDN博客server指定通信的端口是 5099client 使用的端口是動態變化的&#xff0c;因此在wireshark里面需要設定的抓取端口是 5099 使用wireshark開啟抓包 參考鏈接 [tcp] Wir…

double operator[](int i)_java中double類型精度丟失問題及解決方法

原文鏈接&#xff1a;https://blog.csdn.net/yacolspace/article/details/78287394double類型數據加減操作精度丟失問題今天在項目中用到double類型數據加減運算時&#xff0c;遇到了一個奇怪的問題&#xff0c;比如120.2300.03&#xff0c;理論上結果應該是321.23&#xff0c;…

驗證客戶端和服務端可以傳輸經SM4加密的密文數據,從而驗證發送數據已使用服務器密碼機進行SM4加密,而不是隨便的字符串亂碼

前提操作 搭建客戶端和服務端 Socket代碼實現服務端 和 客戶端之間通信_CHYabc123456hh的博客-CSDN博客使用wireshark進行數據的監聽和測試https://blog.csdn.net/CHYabc123456hh/article/details/121929288 結論驗證 使用在線SM4加密&#xff0c;輸入明文 和 選擇模式,生成…

Socket編程 涵蓋代碼和函數參數介紹

Socket是針對端系統&#xff0c;也就是用戶主機上開發程序&#xff0c;不涉及網絡設備(交換機、路由器)獨立于網卡驅動層之上&#xff0c;不涉及硬件&#xff0c;即基于Packet Driver編程端&#xff1a;是指通信雙方兩臺電腦 應用編程接口API 也就是兩端 應用層內部的應用進程之…

springcloud阿里巴巴五大組件_如何無縫遷移 SpringCloud/Dubbo 應用到 Serverless 架構

簡介&#xff1a; 本文分為三部分來介紹&#xff0c;分別介紹微服務應用遷移到 SAE 的優勢&#xff0c;如何遷移 SpringCloud/Dubbo 應用到 SAE 上&#xff0c;以及針對 SpringCloud 應用遷移的實踐演示。背景通過前面幾節課程的學習&#xff0c;相信大家對于 SAE 平臺已經有了…

pythonnone用法_python中None返回值如何使用?

None是python中的特殊存在。作為函數&#xff0c;在用到返回值的經常使用。今天小編就來講講None作為函數返回值時&#xff0c;會出現的三種情況。 一、作為操作類函數的默認返回值 當某個操作類函數不需要任何返回值時&#xff0c;通常就會返回 None。同時&#xff0c;None 也…

C++ Byte轉十六進制字符串輸出

代碼 例子一 typedef std::vector<unsigned char> bytes; std::string BytesToStr(const bytes& in) {bytes::const_iterator from in.cbegin();bytes::const_iterator to in.cend();std::ostringstream oss;for (; from ! to; from)oss << std::hex <&…

frame中src怎么設置成一個變量_Go 語言設計哲學之七:變量聲明須一致

Go 語言&#xff0c;使用變量之前需要先進行變量的聲明。var s string “Golang"n : 666Go 語言有兩類變量包級別(package varible)&#xff1a;在 package 級別可見的變量。如果是導出變量&#xff0c;該變量也可以被視為全局變量&#xff1b;局部變量(local varible)&a…

數據填充規則之PKCS7

程序輸入的數據全部使用Hex 十六進制的格式 IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data 303030303030303030303030303030CC CC表示此位無數據注意事項&#xff1a;考慮到程序采用 PKCS…

getdevicecaps在哪個頭文件里_一招定勝負,while (true) 和 for (;;) 到底哪個更快

在JDK8u的jdk項目下做個很粗略的搜索&#xff1a;mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . | wc -l 369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while (true" . | wc -l 323并沒有差多少。其次&#…

SM4 ECB加密模式 數據對比試驗論證

程序如下 開啟服務器密碼機&#xff0c;調用SM4加密函數&#xff0c;需要注意的是程序輸入的數據全部使用Hex 十六進制的格式 Key IV Data IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data …

二分法查找c語言程序_C語言的那些經典程序 第十四期

戳“在看”一起來充電吧!C語言的那些經典程序 第十四期本期小C給大家帶來三個用C語言解決實際問題的典例。如果全都理解&#xff0c;相信肯定能給大家帶來收獲&#xff01;接下來讓我們看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;運行結果&#xff1a;程序分析:該…

C++ puts函數 打印字符串很方便

參考鏈接 c puts函數_在C / C 中使用puts&#xff08;&#xff09;函數_從零開始的教程世界-CSDN博客

centos網絡隔一段時間就斷_計算機網絡總結

POST跟GET的區別作用GET用于獲取資源&#xff0c;而POST用于傳輸實體參數GET的參數以字符串的格式出現在URL中&#xff0c;而POST的參數存儲在請求實體中。因為URL只支持ASCII碼&#xff0c;故GET的參數如果存在中文等字符就需要先進行編碼&#xff0c;POST參考支持標準字符集。…

C++/C++11中std::runtime_error的使用

參考鏈接 C/C11中std::runtime_error的使用_網絡資源是無限的-CSDN博客_runtimeerror

有python基礎學java_Python基礎學習篇

導讀Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum于1989年底發明&#xff0c;第一個公開發行版發行于1991年。像Perl語言一樣, Python 源代碼同樣遵循 GPL(GNU General Public License)協議。一. 列表1.1 列表的介紹列表是python的…

使用wireshark抓包,本地環回測試通信數據已經通過SM4國密算法加密

具體操作 本實驗采用 本地環回測試開啟wireshark抓包工具&#xff0c;設定端口號 tcp.port 5099 &#xff08;5099為服務端對外開啟服務的端口號&#xff09;&#xff0c;不可以使用ip.addr指定ip地址&#xff0c;因為本地環回測試&#xff0c;相關信息太多&#xff0c;使用端…

public 函數_UE4精品教程 | 渲染編程(C++篇)【第三卷:從仿函數到std::function再到虛幻4Delegate】...

本文轉載于YivanLee知乎作者專題目錄鏈接&#xff1a;https://zhuanlan.zhihu.com/p/67694999這幾天研究了一下虛幻4的delegate&#xff0c;但是想要理解這個&#xff0c;還得從仿函數說起。下面是一段代碼例子&#xff1a;class MyFunctor{ public: int operator()(int …