C/C++ winsock實(shí)現(xiàn)不同設(shè)備實(shí)時(shí)通訊的示例代碼
話不多說,我們先來了解一下套接字連接的原理吧:
第一步,客戶端和服務(wù)端異步啟動(dòng);
第二步,兩端分別創(chuàng)建套接字,填充信息并綁定;
第三步,將服務(wù)端設(shè)為監(jiān)聽狀態(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)聽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)文章
教你5分鐘輕松搞定內(nèi)存字節(jié)對(duì)齊
隨便google一下,人家就可以跟你解釋的,一大堆的道理,我們沒怎么多時(shí)間,討論為何要對(duì)齊.直入主題,怎么判斷內(nèi)存對(duì)齊規(guī)則,sizeof的結(jié)果怎么來的,請(qǐng)牢記以下3條原則2013-09-09
C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析
這篇文章主要介紹了C++ 中二分查找遞歸非遞歸實(shí)現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下2017-06-06
C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換
這篇文章介紹了C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

