Сетевой коммуникационный сокет C++

искусственный интеллект

содержание

Сервер:

Клиент:

Второй способ написать клиент: не использовать функцию inet_pton


Сервер:

#include <iostream>

#include <stdio.h> 

#include <winsock2.h> 

#include <Ws2tcpip.h>

#pragma comment(lib,"ws2_32.lib") 

#define _WINSOCK_DEPRECATED_NO_WARNINGS 1

using namespace std;

int main(int argc, char* argv[])

{

//Инициализировать WSA

    WORD sockVersion = MAKEWORD(2, 2);

    WSADATA wsaData;

    if (WSAStartup(sockVersion, &wsaData) != 0)

    {

        return 0;

    }

//создать сокет

    SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (slisten == INVALID_SOCKET)

    {

        printf("socket error !");

        return 0;

    }

//Привязать IP и порт

    sockaddr_in sin;

    sin.sin_family = AF_INET;

    sin.sin_port = htons(8888);

    sin.sin_addr.S_un.S_addr = INADDR_ANY;

    if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

    {

        printf("bind error !");

    }

// Начать прослушивание

    if (listen(slisten, 5) == SOCKET_ERROR)

    {

        printf("listen error !");

        return 0;

    }

//цикл для получения данных

    SOCKET sClient;

    sockaddr_in remoteAddr;

    int nAddrlen = sizeof(remoteAddr);

    char revData[255];

    while (true)

    {

printf("Ожидание соединения...\n");

        sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);

        if (sClient == INVALID_SOCKET)

        {

            printf("accept error !");

            continue;

        }

        char ip[100];

        if (inet_ntop(AF_INET, &remoteAddr.sin_addr.S_un.S_addr, ip, 100) == NULL)

        {

            cout << "error" << endl;

            return -1;

        }

cout

//Получить данные

        int ret = recv(sClient, revData, 255, 0);

        if (ret > 0)

        {

            revData[ret] = 0x00;

            printf(revData);

        }

//отправляем данные

const char * sendData = "Привет, TCP-клиент!\n";

        send(sClient, sendData, strlen(sendData), 0);

        closesocket(sClient);

    }

    closesocket(slisten);

    WSACleanup();

    return 0;

}

Клиент:

#include<iostream>

#include<WINSOCK2.H>

#include<STDIO.H>

#include<cstring>

#include <Ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

#define _WINSOCK_DEPRECATED_NO_WARNINGS 1

using namespace std;

int main()

{

    WORD sockVersion = MAKEWORD(2, 2);

    WSADATA data;

    if (WSAStartup(sockVersion, &data) != 0)

    {

        return 0;

    }

    while (true) {

        SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        if (sclient == INVALID_SOCKET)

        {

            printf("invalid socket!");

            return 0;

        }

 

        sockaddr_in serAddr;

        serAddr.sin_family = AF_INET;

        serAddr.sin_port = htons(8888);

        inet_pton(AF_INET, "127.0.0.1", &serAddr.sin_addr.S_un.S_addr);

        if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)

{ // Соединение не удалось

            printf("connect error !");

            closesocket(sclient);

            return 0;

        }

 

        char data[1024];

        cin >> data;

        const char * sendData;

sendData = data;//строка в const char*

//char * sendData = "Здравствуйте, TCP-сервер, я клиент\n";

        send(sclient, sendData, strlen(sendData), 0);

//send() используется для передачи данных из указанного сокета на другой хост

        //int send(int s, const void * msg, int len, unsigned int flags)

//s — это сокет, который установил соединение, msg указывает на содержимое данных, len — это длина данных, а для параметра flags обычно установлено значение 0

//Успех, вернуть фактическое количество отправленных символов, не вернуть -1, причина ошибки хранится в error

        char recData[255];

        int ret = recv(sclient, recData, 255, 0);

        if (ret > 0) {

            recData[ret] = 0x00;

            printf(recData);

        }

        closesocket(sclient);

    }

    WSACleanup();

    return 0;

 

}

Второй способ написать клиент: не использовать функцию inet_pton

#include<iostream>

#define _WINSOCK_DEPRECATED_NO_WARNINGS 1

#include<WINSOCK2.H>

#include<STDIO.H>

#include<cstring>

 

#pragma comment(lib, "ws2_32.lib")

 

using namespace std;

int main()

{

    WORD sockVersion = MAKEWORD(2, 2);

    WSADATA data;

    if (WSAStartup(sockVersion, &data) != 0)

    {

        return 0;

    }

    while (true) {

        SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        if (sclient == INVALID_SOCKET)

        {

            printf("invalid socket!");

            return 0;

        }

 

        sockaddr_in serAddr;

        serAddr.sin_family = AF_INET;

        serAddr.sin_port = htons(8888);

        serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

        if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)

{ // Соединение не удалось

            printf("connect error !");

            closesocket(sclient);

            return 0;

        }

        char data[1024];

        cin >> data;

        const char * sendData;

sendData = data;//строка в const char*

//char * sendData = "Здравствуйте, TCP-сервер, я клиент\n";

        send(sclient, sendData, strlen(sendData), 0);

        char recData[255];

        int ret = recv(sclient, recData, 255, 0);

        if (ret > 0) {

            recData[ret] = 0x00;

            printf(recData);

        }

        closesocket(sclient);

    }

    WSACleanup();

    return 0;

}