2

I need to print random numbers that servers sends, but instead its printing random symbols Its a program like lottery, that gives me 5 numbers and 2 stars I search for solution but I didn't find any. Someone can help? This is my code, the important one: .................................

//Código do server
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <time.h>
#include <Windows.h>
#include <cstdint>
#define TRUE 1
#define DS_TEST_PORT 68000

#pragma comment (lib, "ws2_32.lib")
#pragma warning(disable : 4996)

int main()
{
    // Initialise winsock
    WSADATA wsData;
    WORD ver = MAKEWORD(2, 2);
    int chave[7] = { 0, 0, 0, 0, 0, 0, 0, };
    srand(time(0));

    .........
    
    // Main program loop
    char strMsg[1024];
    char strRec[1024];

    int i = 1;

    strcpy(strMsg, "\nHello! welcome to the server...\n");
    printf("\n%s\n", strMsg);
    send(clientSocket, strMsg, strlen(strMsg) + 1, 0);

    while (TRUE) {
        ZeroMemory(strRec, 1024);
        ZeroMemory(strMsg, 1024);
        int bytesReceived = recv(clientSocket, strRec, 1024, 0);
        if (bytesReceived == SOCKET_ERROR) {
            printf("\nReceive error!\n");
            break;
        }
        if (bytesReceived == 0) {
            printf("\nClient disconnected!\n");
            break;
        }

        printf("Client: %s\n", strRec);

        if (strcmp(strRec, "chave") == 0) {

            for (int j = 0; j < 5; j++) {
                strMsg[j] = rand() % 50;
            }
            for (int k = 5; k < 7; k++) {
                strMsg[k] = rand() % 12;
            }
            send(clientSocket, strMsg, strlen(strMsg) + 1, 0);

        }
        else if (strcmp(strRec, "bye") == 0) {

            strcpy(strMsg, "Bye client...\n");
            send(clientSocket, strMsg, strlen(strMsg) + 1, 0);
            Sleep(1000);
            system("pause");
            break;
        }
        else {

            fputs("You: ", stdout);
            fgets(strMsg, 1024, stdin);

            send(clientSocket, strMsg, strlen(strMsg) - 1, 0);  // (-1) para nao enviar \n
        }
    }

    // Close the socket
    closesocket(clientSocket);  

    //Cleanup winsock
    WSACleanup();

    return 1;
}

Client

    /*
    Simple winsock client
*/

int main(int argc, char* argv[])
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char bye[] = "bye\n";
    char* message = (char*)malloc(2000);
    char server_reply[2000];
    int recv_size;
    int ws_result;
   
    .............

    while (TRUE)
    {
        ZeroMemory(message, 1024);
        ZeroMemory(server_reply, 1024);
        fputs("Escreva chave para receber uma chave, escreva bye para sair do programa\n ", stdout);
        fgets(message, 1024, stdin);

        ws_result = send(s, message, strlen(message) - 1, 0);  // (-1) para nao enviar \n
        if (ws_result < 0)
        {
            puts("Send failed");
            return 1;
        }
        //Receive a reply from the server
        recv_size = recv(s, server_reply, 2000, 0);

        if (recv_size == SOCKET_ERROR)
        {
            puts("recv failed");
        }

        printf("Server: %s\n", server_reply);

        if (strcmp(message, bye) == 0)
        {
            system("pause");
            break;
        }
    }
    // Close the socket
    closesocket(s);
    //Cleanup winsock
    WSACleanup();
    return 0;
}

Client Console

Hugo Anes
  • 21
  • 2
  • 1
    `send(clientSocket, strMsg, strlen(strMsg) - 1, 0)` might not send the newline, but it also doesn't send the string null terminator. The client assumes that the null terminator will be included in the data received. If it's not then that leads to *undefined behavior*. – Some programmer dude Apr 10 '21 at 19:02
  • 1
    It's all borken anyway because of the misunderstanding of the stream nature of TCP. – Martin James Apr 11 '21 at 00:01

0 Answers0