C++使用socket實現進程通信


網絡編程:我們都應該知道服務端和客戶端C/S模式,下面我們遵循一個網絡編程的規律:

服務端:socket ——> bind ——> listen ——> accept

客戶端:socket ——> connect

下面就是代碼部分,遵循了上面的規律,大家不懂的函數可以百度查看含義

服務端代碼:

// server.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。


#include <iostream>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {
    //定義長度變量
    int send_len = 0;
    int recv_len = 0;
    int len = 0;
    //定義發送緩沖區和接受緩沖區
    char send_buf[100];
    char recv_buf[100];
    //定義服務端套接字,接受請求套接字
    SOCKET s_server;
    SOCKET s_accept;
    //服務端地址客戶端地址
    SOCKADDR_IN server_addr;
    SOCKADDR_IN accept_addr;
    initialization();
    //填充服務端信息
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(5010);
    //創建套接字
    s_server = socket(AF_INET, SOCK_STREAM, 0);
    if (bind(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
        cout << "套接字綁定失敗!" << endl;
        WSACleanup();
    }
    else {
        cout << "套接字綁定成功!" << endl;
    }
    //設置套接字為監聽狀態
    if (listen(s_server, SOMAXCONN) < 0) {
        cout << "設置監聽狀態失敗!" << endl;
        WSACleanup();
    }
    else {
        cout << "設置監聽狀態成功!" << endl;
    }
    cout << "服務端正在監聽連接,請稍候...." << endl;
    //接受連接請求
    len = sizeof(SOCKADDR);
    s_accept = accept(s_server, (SOCKADDR*)& accept_addr, &len);
    if (s_accept == SOCKET_ERROR) {
        cout << "連接失敗!" << endl;
        WSACleanup();
        return 0;
    }
    cout << "連接建立,准備接受數據" << endl;
    //接收數據
    while (1) {
        recv_len = recv(s_accept, recv_buf, 100, 0);
        if (recv_len < 0) {
            cout << "接受失敗!" << endl;
            break;
        }
        else {
            cout << "客戶端信息:" << recv_buf << endl;
        }
        cout << "請輸入回復信息:";
        cin >> send_buf;
        send_len = send(s_accept, send_buf, 100, 0);
        if (send_len < 0) {
            cout << "發送失敗!" << endl;
            break;
        }
    }
    //關閉套接字
    closesocket(s_server);
    closesocket(s_accept);
    //釋放DLL資源
    WSACleanup();
    return 0;
}
void initialization() {
    //初始化套接字庫
    WORD w_req = MAKEWORD(2, 2);//版本號
    WSADATA wsadata;
    int err;
    err = WSAStartup(w_req, &wsadata);
    if (err != 0) {
        cout << "初始化套接字庫失敗!" << endl;
    }
    else {
        cout << "初始化套接字庫成功!" << endl;
    }
    //檢測版本號
    if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
        cout << "套接字庫版本號不符!" << endl;
        WSACleanup();
    }
    else {
        cout << "套接字庫版本正確!" << endl;
    }
    //填充服務端地址信息

}

客戶端代碼

// client.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。


#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {
    //定義長度變量
    int send_len = 0;
    int recv_len = 0;
    //定義發送緩沖區和接受緩沖區
    char send_buf[100];
    char recv_buf[100];
    //定義服務端套接字,接受請求套接字
    SOCKET s_server;
    //服務端地址客戶端地址
    SOCKADDR_IN server_addr;
    initialization();
    //填充服務端信息
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(5010);
    //創建套接字
    s_server = socket(AF_INET, SOCK_STREAM, 0);
    if (connect(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
        cout << "服務器連接失敗!" << endl;
        WSACleanup();
    }
    else {
        cout << "服務器連接成功!" << endl;
    }

    //發送,接收數據
    while (1) {
        cout << "請輸入發送信息:";
        cin >> send_buf;
        send_len = send(s_server, send_buf, 100, 0);
        if (send_len < 0) {
            cout << "發送失敗!" << endl;
            break;
        }
        recv_len = recv(s_server, recv_buf, 100, 0);
        if (recv_len < 0) {
            cout << "接受失敗!" << endl;
            break;
        }
        else {
            cout << "服務端信息:" << recv_buf << endl;
        }

    }
    //關閉套接字
    closesocket(s_server);
    //釋放DLL資源
    WSACleanup();
    return 0;
}
void initialization() {
    //初始化套接字庫
    WORD w_req = MAKEWORD(2, 2);//版本號
    WSADATA wsadata;
    int err;
    err = WSAStartup(w_req, &wsadata);
    if (err != 0) {
        cout << "初始化套接字庫失敗!" << endl;
    }
    else {
        cout << "初始化套接字庫成功!" << endl;
    }
    //檢測版本號
    if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
        cout << "套接字庫版本號不符!" << endl;
        WSACleanup();
    }
    else {
        cout << "套接字庫版本正確!" << endl;
    }
    //填充服務端地址信息

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM