Неответ с сервера в c ++ с Windows, TCP (RFC 2229) - PullRequest
0 голосов
/ 28 марта 2019

Я делаю код программирования сокета

которые отправляют сокет и получают с сервера. (Www.dict.org)

Я могу подключиться к серверу используя connect и send () (Для подключения серверу требуется одна отправка)

После подключения я отправил массив символов в виде команды, но сервер ничего не отправляет.

Я процитировал части 2.3 и 8 RFC 2229 (https://tools.ietf.org/html/rfc2229)

и я отправил массив символов как "HELP" или "DEFINE! ONE".

Несколько раз сервер отправлял мне сообщение о неправильном заказе.

Но теперь я не могу получить подобное сообщение.

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

using namespace std;

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


void print_array(char x[]);
int count_array(char x[]);

int main()
{
    int iResult;
    WSADATA wsa;
    SOCKET Client_sock;
    struct sockaddr_in Sock_info;

    char message[512];   // recv function's result will be saved.
                         //Command lines MUST NOT exceed 1024 characters in length (Part 2.3 RFC 2229)


    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        cout << "WSAStartup failed with error" << endl;
        system("pause");
        return FALSE;
    }

    Client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Client_sock == INVALID_SOCKET)
    {
        cout << "Failed to create a socket" << endl;
        closesocket(Client_sock);
        return FALSE;
    }

    int nTime = 10000; //10 Sec stopwatch
    if (setsockopt(Client_sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(nTime)) == SOCKET_ERROR)
    {
        shutdown(Client_sock, SD_RECEIVE | SD_SEND);
        closesocket(Client_sock);
        cout << "Waiting" << endl;
        cout << "10 Secs over.";
        system("pause");
        return FALSE;
    }

    memset(&Sock_info, 0, sizeof(Sock_info));// Address structure clear
    Sock_info.sin_family = AF_INET;
    Sock_info.sin_port = htons(2628);// Get port
    InetPton(AF_INET, "216.18.20.172", &Sock_info.sin_addr.s_addr);  //IP of dict.org

    if (connect(Client_sock, (SOCKADDR*)&Sock_info, sizeof(Sock_info)) == SOCKET_ERROR) // The fail of request to connect the server
    {
        closesocket(Client_sock);
        return FALSE;
    }

    //Connect using text capabilities msg-id for code 220 in part 3.1 RFC 2229
    if (send(Client_sock, "[ client initiates connection ]", 512, 0) < 0)
    {
        closesocket(Client_sock);
        return FALSE;
    }

    if (recv(Client_sock, message, 512, 0) < 0)
    {
        closesocket(Client_sock);
        return FALSE;
    }


    cout << "Send Help" << endl;
    char request[] = "<HELP>";
    iResult = send(Client_sock, request, sizeof(request), 0);
    if (iResult < 0)
    {
        cout << "Failed to send a request" << endl;
        system("pause");
        closesocket(Client_sock);
        return FALSE;
    }
    cout << "SENT" << endl;
    while (iResult > 0)
    {
        iResult = recv(Client_sock, message, 512, 0);
        cout << "RECEIVed" << endl;
        if (iResult < 0)
        {
            cout << "Failed to receive a message" << endl;
            system("pause");
            closesocket(Client_sock);
            return FALSE;
        }
        print_array(message);
    }
    print_array(message);
    // Print the information
    int count = 0;


    //4. Close socket
    closesocket(Client_sock);
    //5. Quit winsock

    WSACleanup();
    return 0;
}

int count_array(char x[])
{
    int cnt;
    cnt = 0;
    for (int i = 0; x[i] != '\n'; i++)
    {
        cnt++;
    }
    return cnt;
}
void print_array(char x[])
{
    int i;
    for (i = 0; i < count_array(x); i++)
    {
        cout << x[i];
    }
    cout << endl;
}
```
...