Programowanie sieciowe C++ (Klient-Serwer)

0

Napisałem aplikacje klient serwer opierajaca sie na dwóch programach które komunikuja sie ze sobą z pomocą gniazd (socketów). Program KLIENT przesyła ciąg znaków do programu SERWERA za pomocą polecenia:
send(Gniazdo,bufor,strlen(bufor),NULL); //bufor to zmienna char z danymi
SERWER odbiera dane za pomocą polecenia:
recv(Klient,bufor,1,NULL);
Dane te są zmieniane (zamieniane na int i wykonywane sa odpowiednie działania). Wynik moge normalnie wyswietlić w okienku serwera ale chciałbym aby serwer odesłał wynik do programu klienta i aby klient mógł odczytać wynik. Klient elegancko nawiązuje połączenie z serwerem oraz dobrze ptrzesyła dane, ale chciałbym aby serwer oodesłał dane po obliczeniach do klienta.

Prosze o podpowiedz i pozdrawiam.

1

hi ;>

  1. czemu w recv masz 1 ? to tam jest wielkosc buffora.. nie lepiej odczytac naraz wiecej informacji ? nyooo ale jak chcesz ;> (z tym ze kozystanie z recv za kazdym razem jest bardziej kosztowne niz zbufforowanie danych i pozniejsze kozystanie z tego bufforka zamiast z recv)

1.2) btw przy wysylaniu wyslij lepiej terminator stringoow tez (tj \0).. czyli nie strlen(bufor) a strlen(bufor)+1..

  1. odwracasz sytuacje po prostu
    u klinenta masz:
    send(Gniazdo,bufor,strlen(bufor)+1,NULL); //bufor to zmienna char z danymi
    recv(Gniazdo, wynik, sizeof( wynik ), NULL);
    a na servie:
    recv(Klient,bufor, sizeof(bufor), NULL);
    aaaaa_zrob_obliczenia_siakies( wynik, bufor );
    send(Klient, bufor, strlen(bufor)+1,NULL);

nyo..

0

Bardzo dziekuje za pomoc.

Mam jeszcze jedno pytanie. Jak bedzie wyglądało polecenie send i recv jezeli chciałbym przesyłać zmienne liczbowe np. int.

1

wysylanie:

int asdf = 1234;
send( Gniazdo, &asdf, sizeof(int) ,NULL );

odbior analogiczny:

int asdf = 0;
recv(Gniazdo, &asdf, sizeof( int ), NULL);

aha.. na przyszlosc musisz uwazac co do tego "jakie" inty wysylasz.. tj zapisywane w formacie big-endian (tj najbardziej znaczacy bajt z przodu) czy little-endian (najmniej znaczacy bajt z przodu).. ale ta kwestia dochodzi dopiero jak planujesz pisac oprogramowanie dzialajace na kompach little-endianowych (wszystko kompatybilne z intetelem) i big-endianowych (sparki sunowskie, i afair te takie wielkie servy IBMowe (mainframe'y))jednoczesnie...

(hehe btw PowerPC ownz, bo jest bi-endianowy ;ppp)

0

Po wklejeniu powyższych komend wyskakują błędy.

[C++ Error] kli.cpp(34): E2034 Cannot convert 'int *' to 'const char *'
[C++ Error] kli.cpp(34): E2342 Type mismatch in parameter 'buf' (wanted 'const char *', got 'int *')
[C++ Warning] kli.cpp(48): W8004 'asdf' is assigned a value that is never used

Nie mam pojęcia co może być tego przyczyną.

0

Bo masz zadeklarowane asdf jako int, a powinienes miec jako char (wg prototypu funkcji). Rzutuj typ po prostu...

(char*)(&asdf)

0

Kur..... juz wymiękam psychiczne przy tym.
Prosze kogos o napisaniemi części kodu. Chodzi mi o kalkulator.
Klient wybiera dane (mogą być dwie liczby np: 1 i 5) i po przesłaniu tego na serwer dokonywane sa obliczenia i wynik jest zwracany do klienta.
Dokładnie to mam problem z przeslaniem tych liczb do klienta oraz z powrotem. Obliczenia i cała funkcjonalność kalkulatora jest zrobiona tylko nie potrafie przesłań tych liczb. Ciągi znaków (char) przesyła bez problemu ale jak to zrobić z liczbami. Nawet po przesłaniu liczby jako char i zamianie jej na int funkcją atoi() nie wiem jak z powrotem zamienić ja na char (int to char) abym mógł to odesłać z powrotem wysłać do klienta.

Prosze o pomoc bo juz nie daje rady.

1

odpowiem na drugie pytanie.. _itoa albo sprintf ;>>>
przykladowe uzycie tego drugiego:

char buf[123];
int asdf = 1234;

sprintf( buf, "%i", asdf );
0

Ogromne podziekowania.

Konwersja z char to int oraz z int to char załatwiła sprawe.

Wielkie dzieki.

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