PDA

Visualizza la versione completa : [VC++] Socket: problema con recv


fermat
08-10-2012, 16:05
salve!
ho un problemino sul server socket che sto facendo.
in pratica manda i messaggi al client ma sembra che ci sia un problema in in ricezione, in quanto in console stampa -1.
supponendo di aver fatto bene sul client, secondo voi dove potrei sabgliare sul server:


int Server::initConnection() {
cout << "SERVER STARTED. PRESS ENTER EXIT" << endl;
WSADATA wsaData;
sockaddr_in local;
sockaddr_in from;
int wsaret = WSAStartup(0x101, &wsaData);
int fromlen = sizeof(from);

local.sin_family = AF_INET; // ADDRESS FAMILY
local.sin_addr.s_addr = INADDR_ANY; // WILD CARD IP ADDRESS
local.sin_port = htons((u_short) 20248); // PORT
server = socket(AF_INET, SOCK_STREAM, 0);

while(true)
{
char temp[512];
inAscolto = accept(server, (struct sockaddr*) &from, &fromlen);
sprintf_s(temp, "YOUR IP IS: %s", inet_ntoa(from.sin_addr));
send(inAscolto, temp, strlen(temp), 0);
cout << "CONNECTION FROM " << inet_ntoa(from.sin_addr) << endl;
cout << recv(inAscolto, temp, strlen(temp), 0) << endl;
}
}

sidius
08-10-2012, 16:38
non devi scrivere il valore di ritorno della funzione recv() ma la variabile temp

c0der
08-10-2012, 17:08
Oltre a quotare sidius aggiungo che quando ricevi devi usare sizeof(temp), non strlen(temp) altrimenti finiresti per ricevere al massimo per la lunghezza della tuo testo che prima hai spedito, cosa un po' assurda.

fermat
08-10-2012, 17:52
ho modificato così, sennò ricevevo lo stesso messaggio che inviavo:


while(true)
{
char temp[512];
char temp2[512];
inAscolto = accept(server, (struct sockaddr*) &from, &fromlen);
sprintf_s(temp, "YOUR IP IS: %s", inet_ntoa(from.sin_addr));
send(inAscolto, temp, strlen(temp), 0);
cout << "CONNECTION FROM: " << inet_ntoa(from.sin_addr) << endl;
recv(server, temp2, sizeof(temp2), 0);
cout << temp2 << endl;
}

c'è un altro problema.
in pratica mi arriva un messaggio un pò strano:


simbolo_freccia_su frecia_sx_freccia_dx D

se mi dite che qua sul server ho fatto giusto probabilem che ci sia un errore dall'altra parte.
che mi dite???

sidius
08-10-2012, 17:54
prova a fare il ZeroMemory() della variabile che riceve nel client subito dopo l'inizializzazione

fermat
09-10-2012, 10:23
Originariamente inviato da sidius
prova a fare il ZeroMemory() della variabile che riceve nel client subito dopo l'inizializzazione
nn sono ancora molto esperto di c++.
ho letto cosa si intende per ZeroMemory(), ma nn ho ben capito per quale variabile lo dovrei fare.

sidius
09-10-2012, 20:21
lo dovresti fare della variabile che riceve il messaggio nel client



char temp2[512];
ZeroMemory(temp2, 512);
recv(server, temp2, sizeof(temp2), 0);

fermat
10-10-2012, 15:18
diciamo che al 99% ho appurato che il client sta a posto.
adesso nn arriva più nulla a prescindere da zeromemory:


int Server::initConnection() {
cout << "SERVER STARTED. PRESS ENTER EXIT" << endl;
WSADATA wsaData;
sockaddr_in local;
sockaddr_in from;
int wsaret = WSAStartup(0x101, &wsaData);
int fromlen = sizeof(from);

local.sin_family = AF_INET; // ADDRESS FAMILY
local.sin_addr.s_addr = INADDR_ANY; // WILD CARD IP ADDRESS
local.sin_port = htons((u_short) 20248); // PORT
server = socket(AF_INET, SOCK_STREAM, 0);

while(true)
{
char temp[1024];
char temp2[1024];
ZeroMemory(temp2, 1024);
inAscolto = accept(server, (struct sockaddr*) &from, &fromlen);
sprintf_s(temp, "YOUR IP IS: %s", inet_ntoa(from.sin_addr));
send(inAscolto, temp, strlen(temp), 0);
cout << "CONNECTION FROM: " << inet_ntoa(from.sin_addr) << endl;
recv(inAscolto, temp2, sizeof(temp2), 0);
cout << temp2 << endl;
}

}

Loading