Я могу получить только одно слово (winsock c ++ tcp / ip server и клиент) - PullRequest
0 голосов
/ 07 июля 2019

Мне удалось создать tcp сервер и клиент с winsock на c ++, но по неизвестной мне причине я не могу отправить более одного слова за раз.

посмотрите сами:

snapshot

Я указываю, что я абсолютный новичок и что мой код, вероятно, содержит ошибки, поэтому не стесняйтесь исправлять меня, если вы найдете какие-либо.(также английский не мой родной язык, так что извините за орфографическую ошибку).

Я прошу помощи, потому что я потратил несколько часов на поиски решения своей проблемы, не найдя его.Я думаю, что пропустил часть своего кода, но я не знаю, где и почему.Я посмотрел на исходный код сервера и клиента, созданный другими людьми, но я не вижу, как мой собственный отличается.(Извините, если я сделал очень простую ошибку)

client.cpp


    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #include <iostream>
    #include <WinSock2.h>
    #include <WS2tcpip.h>
    #include <string>
    #include <stdio.h>

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

    int main()
    {
        std::cout << "--- Chat Section ---" << std::endl;

        WSADATA wsa;
        WSAStartup(MAKEWORD(2, 2), &wsa);
        sockaddr_in dest;
        dest.sin_family = AF_INET;
        dest.sin_port = htons(8888);
        dest.sin_addr.s_addr = inet_addr("127.0.0.1");
        SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        connect(client, (sockaddr*)& dest, sizeof(dest));

        std::string ok;
        char buf[512];
        do
        {

            std::cin >> ok;
            if (ok.size() > 0)
            {
                send(client, ok.c_str(), ok.length(), 0);
                ZeroMemory(&buf, sizeof(buf));
                int okok = recv(client, buf, 512, 0);
                if (okok > 0)
                {
                    std::string str(buf);
                    std::cout <<">> "<< str << std::endl;
                    std::cout << std::endl;
                    // std::cout << std::string(buf, 0, okok) << std::endl;
                }
            }
        } while (true);

        system("pause");
        return 0;
    }

server.cpp

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>

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

int main()
{
    std::cout << "Server tcp/ip test V.14.0" << std::endl;

    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);
    sockaddr_in server, client;

    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(8888);
    // bind
    bind(s, (sockaddr*)& server, sizeof(server));
    //listen
    listen(s, 3);
    //Accept
    sockaddr_in from; // for the client
    int fromlen = sizeof(from);
    SOCKET clientS = accept(s, (sockaddr*)& from, &fromlen);
    if (clientS == INVALID_SOCKET)
    {
        std::cout << "error with accept()" << std::endl;
    }


    char recvbuf[512];


    do
    {
        int iResult = recv(clientS, recvbuf, 512, 0);
        if (iResult > 0)
        {
            send(clientS, recvbuf, iResult, 0);
        }



    } while(true);



    system("pause");
    return 0;
}
...