#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);
, здесь нет массивов.