Является ли это преобразование правильным подходом для отправки по протоколу TCP/IP?

#c #tcp

Вопрос:

Я хочу отправить сетевой байт по протоколу TCP/IP, используя int sendResult = send(sock, (char*)networkbyte, sizeof(userInput_converted), 0); правильное ли это преобразование или я делаю что-то не так? Каким-то образом, чем я отправляю его, принимающий конец получает 0 вместо числа, которое я ввел.

 #include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>

using namespace std;

wchar_t buffer[1024];
int buffer_converted[1] = { 0 };

uint16_t networkbyte;
uint16_t hostbyte;

int convert(int input[]) {
    networkbyte = htons(input[1]);
    return 0;
}

int main()
{
    cout << "Input a numbern";
    wcin >> buffer;
    buffer_converted[1] = { _wtoi(buffer) };
    convert(buffer_converted);
}

 

Ниже приведен мой клиентский код TCP/IP. Может быть, проблема здесь? Я все еще изо всех сил стараюсь заставить его работать без каких-либо предупреждений.

 #include <iostream>
#include <string>
#include <WS2tcpip.h>
#include <sstream>
#include <iomanip>
#include "CSV-Writer.h"
#include <vector>
#pragma comment(lib, "ws2_32.lib")


using namespace std;

int TcpIpClient(int userInput)
{
    string ipAddress = "192.168.0.2";           // IP Address of the server
    int port = 2000;                        // Listening port # on the server

    // Initialize WinSock
    WSAData data;
    WORD ver = MAKEWORD(2, 2);
    int wsResult = WSAStartup(ver, amp;data);
    if (wsResult != 0)
    {
        //cerr << "Can't start Winsock, Err #" << wsResult << endl;
        return 10;
    }

    // Create socket
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET)
    {
        //cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
        WSACleanup();
        return 11;
    }

    // Fill in a hint structure
    sockaddr_in hint;
    hint.sin_family = AF_INET;
    hint.sin_port = htons(port);
    inet_pton(AF_INET, ipAddress.c_str(), amp;hint.sin_addr);

    // Connect to server
    int connResult = connect(sock, (sockaddr*)amp;hint, sizeof(hint));
    if (connResult == SOCKET_ERROR)
    {
        //cerr << "Can't connect to server, Err #" << WSAGetLastError() << endl;
        closesocket(sock);
        WSACleanup();
        return 12;
    }

    // Do-while loop to send and receive data
    char buf[4096];
    bool active = true;
    bool a = false;

    do
    {
        // Prompt the user for some text
        //cout << "> ";
        //cin >> userInput[0];


        if (sizeof(userInput) > 0 amp;amp; a == false)        // Make sure the user has typed in something
        {
            uint64_t userInput_converted;
            //for (int i = 0; i < sizeof(userInput); i  ) {
            //  userInput_converted[i] = htonl(userInput[i]);
            //}
            userInput_converted = htons(userInput);
            int sendResult = send(sock, (char*)userInput_converted, sizeof(userInput_converted), 0);
            if (sendResult == SOCKET_ERROR)
            {
                //std::cout << "Socket Error!";
                return 13;
            }
            a = true;
        }
            // Wait for response
            ZeroMemory(buf, 4096);
            int bytesReceived = recv(sock, buf, 4096, 0);
            if (bytesReceived > 0)
            {
                short int* ibuf = (short int*)buf;
                std::vector<int> InputData;
                for (int i = 0; i < bytesReceived / 2;   i,   ibuf)
                {
                    short result = ntohs(*ibuf);
                    InputData.push_back(result);
                    //std::cout << result << std::endl;

                }
                if(CsvWriter(InputData)==0){
                }
                active = false;
            

        }

    } while (active == true);

    // Gracefully close down everything
    closesocket(sock);
    WSACleanup();
    return 0;
}
 

Комментарии:

1. buffer_converted[1] находится вне пределов досягаемости…

2. int buffer_converted[1]; почему массив? почему бы просто не int buffer_converted; сделать это ?

3. У вас переполнен буфер. Индексы массивов в C основаны на нуле, так и должно быть buffer_converted[0] input[0] соответственно). Это само по себе может вызвать любую проблему, но с тем же успехом это может быть где-то в коде, который вы не показали.

4. @Jarod42 может быть, я ошибаюсь, но у меня есть только htons для работы с массивом, поэтому я помещаю массив в определение функции и передаю массив непосредственно функции, может быть, я сделал что-то не так, и htons также работает с int?

5. uint16_t htons(uint16_t hostshort); , здесь нет массивов.