Создание консольного чата
От: Olegator  
Дата: 04.10.03 10:10
Оценка:
Есть две программы:

// Chat_Server.cpp

#include <iostream>
#include <vector>
#include <winsock2.h>

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

using namespace std;

char* ReadLine(SOCKET source);

int main()
{
    WSADATA wd;
    WSAStartup(WINSOCK_VERSION, &wd);

    SOCKET server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    SOCKADDR_IN name;
    name.sin_family         = PF_INET;
    name.sin_addr.s_addr    = inet_addr("127.0.0.1");
    name.sin_port           = htons(4000);

    bind(server, (LPSOCKADDR)&name, sizeof(name));
    listen(server, SOMAXCONN);

    SOCKET client = accept(server, NULL, NULL);

    cout << ReadLine(client);

    closesocket(server);
    closesocket(client);
    WSACleanup();

    cin.get();

    return 0;
}

char* ReadLine(SOCKET source)
{
    vector<char> data;
    char buffer;
    while(recv(source, &buffer, 1, 0) != 0)
        data.push_back(buffer);

    int size    = static_cast<int>(data.size());
    char* line    = new char[size + 1];
    memset(line, 0, size + 1);

    for(int i = 0; i < size; i++)
        line[i] = data[i];

    return line;
}


// Chat_Client.cpp

#include <iostream>
#include <winsock2.h>

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

using namespace std;

int main()
{
    WSADATA wd;
    WSAStartup(WINSOCK_VERSION, &wd);

    SOCKET client = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    SOCKADDR_IN name;
    name.sin_family         = PF_INET;
    name.sin_addr.s_addr    = inet_addr("127.0.0.1");
    name.sin_port           = htons(4000);

    connect(client, (LPSOCKADDR)&name, sizeof(name));

    send(client, "Text of message", sizeof("Text of message"), 0);

    closesocket(client);
    WSACleanup();

    cin.get();

    return 0;
}


Я пишу консольный чат. А вот мой вопрос: как сделать так, чтобы сервер мог не только принимать, но и передавать, а клиент — не только передавать, но и принимать. То есть взаимодействие будет такое: клиент передаёт сообщение на сервер, сервер смотрит, кому предназначается сообщение, и передаёт его клиенту-адресату.

Буду признателен за ответ.
RSDN@Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.