欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++ winsock實現(xiàn)不同設(shè)備實時通訊的示例代碼

 更新時間:2023年09月11日 09:35:16   作者:qcqzz233  
這篇文章主要為大家詳細介紹了C/C++如何利用winsock連接實現(xiàn)不同設(shè)備實時通訊,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

話不多說,我們先來了解一下套接字連接的原理吧:

第一步,客戶端和服務(wù)端異步啟動;

第二步,兩端分別創(chuàng)建套接字,填充信息并綁定;

第三步,將服務(wù)端設(shè)為監(jiān)聽狀態(tài),等待連接;

客戶端發(fā)起連接請求,建立連接。

最后,雙端進行數(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); // 可以修改為其他端口號
    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ā)送信息存儲地址
    char recvBuf[1024];   //接收信息存儲地址
    // 初始化WSA
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {  //錯誤處理
        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"); // 修改為實際的服務(wù)端IP(可以查詢本機ip)
    serverAddr.sin_port = htons(12345); // 修改為實際的服務(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實現(xiàn)不同設(shè)備實時通訊的示例代碼的文章就介紹到這了,更多相關(guān)C++ winsock內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++遍歷文件夾下文件的方法

    C++遍歷文件夾下文件的方法

    這篇文章主要介紹了C++遍歷文件夾下文件的方法,實例分析了C++針對文件夾遍歷的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 結(jié)合C++11的新特性來解析C++中的枚舉與聯(lián)合

    結(jié)合C++11的新特性來解析C++中的枚舉與聯(lián)合

    這篇文章主要介紹了C++編程中的枚舉與聯(lián)合,結(jié)合了范圍(或強類型)enum class類型等C++11的新特性來講解,需要的朋友可以參考下
    2016-01-01
  • C語言由淺入深講解線程的定義

    C語言由淺入深講解線程的定義

    這篇文章主要介紹了C語言中線程的基礎(chǔ)知識,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • VS C++頭文件引用提示“未定義標識符”的問題解決

    VS C++頭文件引用提示“未定義標識符”的問題解決

    本文主要介紹了VS C++頭文件引用提示“未定義標識符”的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu)

    用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu)

    這篇文章主要介紹了用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu),是數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08
  • Qt連接MySQL數(shù)據(jù)庫的實現(xiàn)(保姆級成功版教程)

    Qt連接MySQL數(shù)據(jù)庫的實現(xiàn)(保姆級成功版教程)

    本文主要介紹了Qt連接MySQL數(shù)據(jù)庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C語言中typedef的用法以及#define區(qū)別詳解

    C語言中typedef的用法以及#define區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于C語言中typedef用法以及#define區(qū)別的相關(guān)資料,typedef 是用來定義一種類型的新別名的,它不同于宏(#define),不是簡單的字符串替換。而#define只是簡單的字符串替換(原地擴展),需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)簡單掃雷小游戲

    C++實現(xiàn)簡單掃雷小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++中cin的返回值問題

    C++中cin的返回值問題

    這篇文章主要介紹了C++中cin的返回值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C/C++中比較字符串的方法詳解

    C/C++中比較字符串的方法詳解

    這篇文章主要介紹了C/C++中比較字符串的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論