Aplikacja klient-serwer, puste wiadomości

0

Napisałem sobie prosty program klient-serwer i mam problem, bo nawet jak klient nie wyśle wiadomości to serwer to odbiera i wyświetla pusty komunikat. Linijkę, która mi nie działa zaznaczyłem komentarzem (w kodzie serwera).

KLIENT:

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    struct hostent *server;
    SOCKET client;
    SOCKADDR_IN address;
    
    WSAStartup(MAKEWORD(2,2), &wsadata);
    client = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    
    char *ipaddress, *message;
    
    if(argc != 2)
    {
        printf("usage: client <ip_address>");
        return 0;
    }
    ipaddress = argv[1];
    
    int PORT = 44777;
    
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = inet_addr(ipaddress);
    
    connect(client, (struct sockaddr*)&address, sizeof(address));
    
    while(1)
    {
            scanf("> %s", &message);
            send(client, message, sizeof(message), 0);
            Sleep(10);
    }
    
    system("PAUSE>NUL");	
    return 0;
}

SERWER:

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    SOCKET client, _listen;
    SOCKADDR_IN address, client_address;
    char *text;
    char message[512];
    
    WSAStartup(MAKEWORD(2,2), &wsadata);
    _listen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    
    int PORT = 44777;
    int address_length;
    int i;
    
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(_listen, (struct sockaddr*)&address, sizeof(address));
    listen(_listen, 10);
    address_length = sizeof(client_address);
    client = accept(_listen, (struct sockaddr*)&client_address, &address_length);
    
    while(1)
    {
            for(i = 0 ; i < sizeof(message) ; i++)
            {
                    char c[1] = "";
                    message[i] = c[0];
            }
            recv(client, message, sizeof(message), 0);
            text = message;
            if(text != "") //to porównanie nie działa
                     MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
    }
    closesocket(client);
    WSACleanup();
    
    system("PAUSE>NUL");	
    return 0;
}
1

Klient:

    char *ipaddress, *message;
...
  while(1)
    {
            scanf("> %s", &message);  <---- nie alokujesz pamięci do message a już do niej wczytujesz
            send(client, message, sizeof(message), 0);      <--- sizeof(message) == sizeof(int) == 4B
            Sleep(10);
    }



  while(1)
    {
            scanf("%s", &message);
            send(client, message, strlen(message), 0);
            delete []message;
            Sleep(10);
    }

serwer:

 

while(1)
    {
            for(i = 0 ; i < sizeof(message) ; i++)   //nie mam pojęcia jakie zadanie ma ta pętla
            {
                    char c[1] = "";
                    message[i] = c[0];
            }
            recv(client, message, sizeof(message), 0);  // jak wyżej, sizeof message to to samo co sizeof(int)=4B
            text = message;                                     // w ten sposób nie kopiujesz ciągu znaków do text, tylko text wskazuje na tablice message, na ten sam obszar w pamięci.
            if(text != "") //to porównanie nie działa, bo jest złe, jak już porównujesz wskaźniki to do NULL(0) - wskaźnik to typ liczbowy
                     MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
    }



 
   while(1)
    {
            memset(message, 0, 512);
            recv(client, message, 512, 0);
            cout<<message<<endl;
    }

To będzie na tyle patrząc z grubsza. Weź pod uwagę też, że jak klient wysyła strlen(tablicaznakowa) to wysyła same znaki bez końcowego znaku \0 więc server wypisze tą wiadomość i jakieś krzaki z pamięci. Daj żeby klient wysyłał strlen(message)+1, albo zapamiętaj ile bajtów odebrałej w recv() i na tym indexie dodaj znak '\0';

int a=recv(client, message, 512, 0);
message[a]='\0';

Masz te same błędy co ja na starcie ;)

0
int bytes; 
    while(1)
    {
            bytes = recv(client, message, sizeof(message), 0);
            if(bytes) {
                     message[bytes+1] = '/0';
                     MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
            }
    }

RTFM

@Edit
Plus to co @up

0

Podaje kod po poprawkach, proszę nadal o pomoc, bo dalej nie działa...

KLIENT:

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    struct hostent *server;
    SOCKET client;
    SOCKADDR_IN address;
    
    WSAStartup(MAKEWORD(2,2), &wsadata);
    client = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    
    char *ipaddress, *message;
    
    if(argc != 2)
    {
        printf("usage: client <ip_address>");
        return 0;
    }
    ipaddress = argv[1];
    
    int PORT = 44777;
    
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = inet_addr(ipaddress);
    
    connect(client, (struct sockaddr*)&address, sizeof(address));
    message = (char*) malloc (128);
    while(1)
    {
            scanf("> %s", &message);
            message[strlen(message)] = '\0'; //tak?
            send(client, message, strlen(message), 0);
            Sleep(10);
    }
    
    system("PAUSE>NUL");	
    return 0;
}

SERWER:

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    SOCKET client, _listen;
    SOCKADDR_IN address, client_address;
    char *text;
    char *message;
    
    WSAStartup(MAKEWORD(2,2), &wsadata);
    _listen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    
    int PORT = 44777;
    int address_length;
    int i;
    
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(_listen, (struct sockaddr*)&address, sizeof(address));
    listen(_listen, 10);
    address_length = sizeof(client_address);
    client = accept(_listen, (struct sockaddr*)&client_address, &address_length);
    int bytes;
    message = (char*) malloc (128);
    while(1)
    {
            
            bytes = recv(client, message, strlen(message), 0);
            if(bytes) {
					 message[bytes+1] = '/0'; //overflow warning... ?
                     MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
            }
    }
    closesocket(client);
    WSACleanup();
    
    system("PAUSE>NUL");	
    return 0;
}
0

Podbijam temat, bardzo proszę jakby ktoś mógł poprawić mój kod i go tutaj umieścić.

0

Coś dochodzić powinno, musisz sprawdzać co zwracają kolejne funkcje socket, connect itd... w gooogle nazwafunkcji msdn i pierwszy link, tam masz cos takiego zawsze

Return value
If no error occurs, connect returns zero. Otherwise, it returns SOCKET_ERROR, and a specific error code can be retrieved by calling WSAGetLastError.

Po tym sprawdzasz czy wystąpił błąd, jeżeli tak to wywylujesz WSAGetLastError() która zwraca numer błędu. Daj go tutaj.


    while(1)
    {
            scanf("> %s", &message);    
            send(client, message, strlen(message)+1, 0);
            Sleep(10);
    }


server

    while(1)
    {
 
            recv(client, message, 128, 0); //strlen() zwróci zero, bo przecież w message nic nie ma na starcie
            MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
    }

0

Poprawiłem kilka rzeczy i teraz działa!
Poniżej kod, jakby ktoś potrzebował.

KLIENT:

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    struct hostent *server;
    SOCKET client;
    SOCKADDR_IN address;
    
    WSAStartup(MAKEWORD(2,2), &wsadata);
    client = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    
    char *ipaddress, message[512];
    
    if(argc != 2)
    {
        printf("usage: client <ip_address>");
        return 0;
    }
    ipaddress = argv[1];
    
    int PORT = 44777;
    
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = inet_addr(ipaddress);
    
    connect(client, (struct sockaddr*)&address, sizeof(address));
    while(1)
    {
            fgets(message, 512, stdin);
            send(client, message, 512, 0);
            Sleep(10);
    }
    
    system("PAUSE>NUL");	
    return 0;
}

SERWER:

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

int main(int argc, char *argv[])
{
    WSADATA wsadata;
    SOCKET client, _listen;
    SOCKADDR_IN address, client_address;
    char *text;
    char message[512];
    
    WSAStartup(MAKEWORD(2,2), &wsadata);
    _listen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    
    int PORT = 44777;
    int address_length;
    int i;
    
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(_listen, (struct sockaddr*)&address, sizeof(address));
    listen(_listen, 10);
    address_length = sizeof(client_address);
    client = accept(_listen, (struct sockaddr*)&client_address, &address_length);
    int bytes;
    
    while(1)
    {
            
            bytes = recv(client, message, 512, 0);
            if(bytes) {
                     MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
                     memset(message, '\0', 512);
            }
    }
    closesocket(client);
    WSACleanup();
    
    system("PAUSE>NUL");	
    return 0;
}
0
 

    while(1)
    {
 
            bytes = recv(client, message, 512, 0);
            if(bytes) {
                     MessageBox(0, message, "wiadomosc od klienta", MB_ICONERROR);
                     memset(message, '\0', 512);
            }
    }

Nie wiem po co tu sprawdzasz ile bajtów odebrało, recv mrozi działanie programu zanim czegoś nie odbierze więc twój warunek jest zawsze spełniony.

 

    while(1)
    {
            fgets(message, 512, stdin);
            send(client, message, 512, 0);
            Sleep(10);
    }

Pobierasz ciąg znaków od użytkownika np. 5 znaków, a wysyłasz i tak 512 bajtów. send(client, message, strlen(message)+1, 0); +1 żeby wysłało też '\0'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1