C/C++ winsock實(shí)現(xiàn)不同設(shè)備實(shí)時(shí)通訊的示例代碼
話不多說(shuō),我們先來(lái)了解一下套接字連接的原理吧:
第一步,客戶端和服務(wù)端異步啟動(dòng);
第二步,兩端分別創(chuàng)建套接字,填充信息并綁定;
第三步,將服務(wù)端設(shè)為監(jiān)聽(tīng)狀態(tài),等待連接;
客戶端發(fā)起連接請(qǐng)求,建立連接。
最后,雙端進(jìn)行數(shù)據(jù)交流,關(guān)閉服務(wù)器。
具體看代碼:
服務(wù)端:
#include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr, clientAddr; int clientAddrLen = sizeof(clientAddr); char recvBuf[1024]; char sendBuf[1024]; // 初始化WSA if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed!\n"); return 1; } // 創(chuàng)建Socket serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { printf("create socket failed!\n"); return 1; } // 綁定地址 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(12345); // 可以修改為其他端口號(hào) if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("bind failed!\n"); closesocket(serverSocket); return 1; } // 監(jiān)聽(tīng)Socket if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { printf("listen failed!\n"); closesocket(serverSocket); return 1; } printf("server is running...\n"); // 等待客戶端連接 clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen); if (clientSocket == INVALID_SOCKET) { printf("accept failed!\n"); closesocket(serverSocket); return 1; } // 接收消息 memset(recvBuf, 0, sizeof(recvBuf)); recv(clientSocket, recvBuf, sizeof(recvBuf), 0); printf("receive message: %s\n", recvBuf); // 發(fā)送消息 strcpy(sendBuf, "Hello, Client!"); send(clientSocket, sendBuf, strlen(sendBuf), 0); printf("send message: %s\n", sendBuf); // 關(guān)閉Socket closesocket(clientSocket); closesocket(serverSocket); // 清理WSA WSACleanup(); return 0; }
客戶端:
#include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsaData; SOCKET clientSocket; struct sockaddr_in serverAddr; char sendBuf[1024]; //發(fā)送信息存儲(chǔ)地址 char recvBuf[1024]; //接收信息存儲(chǔ)地址 // 初始化WSA if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { //錯(cuò)誤處理 printf("WSAStartup failed!\n"); return 1; } // 創(chuàng)建Socket clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //tcp協(xié)議,采用阻塞傳輸 if (clientSocket == INVALID_SOCKET) { printf("create socket failed!\n"); return 1; } // 配置Server地址 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 修改為實(shí)際的服務(wù)端IP(可以查詢本機(jī)ip) serverAddr.sin_port = htons(12345); // 修改為實(shí)際的服務(wù)端端口 // 連接服務(wù)器 if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("connect server failed!\n"); closesocket(clientSocket); return 1; } // 發(fā)送消息 strcpy(sendBuf, "Hello, Server!"); send(clientSocket, sendBuf, strlen(sendBuf), 0); printf("send message: %s\n", sendBuf); // 接收消息 memset(recvBuf, 0, sizeof(recvBuf)); recv(clientSocket, recvBuf, sizeof(recvBuf), 0); printf("receive message: %s\n", recvBuf); // 關(guān)閉Socket closesocket(clientSocket); // 清理WSA WSACleanup(); return 0; }
到此這篇關(guān)于C/C++ winsock實(shí)現(xiàn)不同設(shè)備實(shí)時(shí)通訊的示例代碼的文章就介紹到這了,更多相關(guān)C++ winsock內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
結(jié)合C++11的新特性來(lái)解析C++中的枚舉與聯(lián)合
這篇文章主要介紹了C++編程中的枚舉與聯(lián)合,結(jié)合了范圍(或強(qiáng)類型)enum class類型等C++11的新特性來(lái)講解,需要的朋友可以參考下2016-01-01VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問(wèn)題解決
本文主要介紹了VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07用C語(yǔ)言判斷一個(gè)二叉樹(shù)是否為另一個(gè)的子結(jié)構(gòu)
這篇文章主要介紹了用C語(yǔ)言判斷一個(gè)二叉樹(shù)是否為另一個(gè)的子結(jié)構(gòu),是數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08Qt連接MySQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)(保姆級(jí)成功版教程)
本文主要介紹了Qt連接MySQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06C語(yǔ)言中typedef的用法以及#define區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中typedef用法以及#define區(qū)別的相關(guān)資料,typedef 是用來(lái)定義一種類型的新別名的,它不同于宏(#define),不是簡(jiǎn)單的字符串替換。而#define只是簡(jiǎn)單的字符串替換(原地?cái)U(kuò)展),需要的朋友可以參考下2021-07-07