PDA

Visualizza la versione completa : [C++] Socket ed errato funzionamento (solo in locale)


solefran
14-01-2006, 14:55
Ciao a tutti,
ho provato a svillupare un semplice client-server con Winsock che funziona in locale ma non su due diversi computer... Posto il codice, sperando che possiate aiutarmi!

Server:



#include <iostream>
#include <winsock.h>
#include <string.h>
using namespace std;

int main() {

short nPort = 2000;
char message[256];
char szBuf[256];
int nRet;
int nLen = sizeof(SOCKADDR);

WORD wRequested = MAKEWORD(1,1);
WSADATA wsaData;

nRet = WSAStartup(wRequested,&wsaData);

SOCKET xSocket;
xSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

SOCKADDR_IN saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY;
saServer.sin_port = htons(nPort);

nRet = bind(xSocket, (LPSOCKADDR)&saServer, sizeof(struct sockaddr));

SOCKADDR_IN saClient;

loop:
memset(szBuf, 0, sizeof(szBuf));
nRet = recvfrom(xSocket, szBuf, sizeof(szBuf), 0, (LPSOCKADDR)&saClient, &nLen);

cout<< szBuf<< endl;

memset(szBuf, 0, sizeof(szBuf));
cout<< "\t";

cin.get(message, 256, '\n');
while(cin.get() != '\n');

strcpy(szBuf, message);
sendto (xSocket, szBuf, strlen(szBuf), 0, (LPSOCKADDR)&saClient, nLen);
goto loop;

closesocket (xSocket);
WSACleanup();

system("PAUSE");
}


------------------------------------

Client:



#include <winsock.h>
#include <iostream>
#include <string.h>
using namespace std;

int main() {
short nPort = 2000;
char szBuf[256];
int nRet;
int nLen = sizeof(SOCKADDR);
int nLen2;
char message[256];

WORD wRequested = MAKEWORD(1,1);
WSADATA wsaData;

nRet = WSAStartup(wRequested, &wsaData);

// LPHOSTENT lpHostEntry = gethostbyname("camcatie");

SOCKET xSocket;
xSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

SOCKADDR_IN saServer;
saServer.sin_family = AF_INET;
// saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
saServer.sin_addr.S_un.S_un_b.s_b1 = 10;
saServer.sin_addr.S_un.S_un_b.s_b2 = 0;
saServer.sin_addr.S_un.S_un_b.s_b3 = 0;
saServer.sin_addr.S_un.S_un_b.s_b4 = 1;
saServer.sin_port = htons(nPort);

loop:
memset(szBuf, 0, sizeof(szBuf));
recvfrom(xSocket, szBuf, sizeof(szBuf), 0, (LPSOCKADDR)&saServer, &nLen);
cout<< szBuf<< endl;

cout<< "\t";
cin.get(message, 256, '\n');
while (cin.get() != '\n');

memset(szBuf, 0, sizeof(szBuf));
strcpy(szBuf, message);
sendto(xSocket, szBuf, strlen(szBuf), 0, (LPSOCKADDR)&saServer, nLen);
goto loop;

closesocket(xSocket);
WSACleanup();

system("PAUSE");
}


:bh:

oregon
14-01-2006, 18:02
Troppo poco per capire quale e' l'errore ...

Potrebbe essere un banale problema di risoluzione dei nomi ...

Come sono collegati i PC? Il nome del server viene risolto correttamente dal client? Hai provato usando l'IP del server al posto del nome? Cosa succede se scrivi

TRACERT nomeserver

solefran
14-01-2006, 22:48
Si infatti la prima versione usavo il nome del server, ma dopo l'ho escluso con i commenti e uso l'indirizzo ip, i due computer sono collegati in internet e non ho idea di come fare i controlli che mi hai chiesto. Dove inserisco il TRACERT nomeserver, posso anche usare l'ip con TRACERT?

Grazie :ciauz:

oregon
15-01-2006, 00:01
TRACERT lo usi in una finestra DOS.

Pero' non ho capito ... il computer e' su internet ed e' un server Web o qualcosa di registrato in un DNS oppure e' un tuo server personale?

solefran
15-01-2006, 00:43
ok, da bravo pirlone ho messo l'indirizzo ip sbagliato. I due computer sono due computer normali, non sono server. Adesso se uso il server su un computer e il client sull'altro funziona, se faccio l'inverso no. Ho anche provato a disabilitare il firewall sulla porta per provare, ma ninete. TRCERT funziona senza problemi...
:dh:

oregon
15-01-2006, 01:04
Disabilita completamente i fw da ambedue le parti ...

Per il resto non posso dirti di piu' ...

solefran
15-01-2006, 01:09
Grazie in ogni caso. Magari posso ancora usufruire della tua bonta' chiedendoti un consiglio del tipo:

Con il codice che ho scritto funziona solo il client manda un messaggio, il server manda un messaggio il client manda...

C'e' la possibilita' secondo te di eliminare questo blocco? Forse devo aprire due finestre una solo per ascoltare e una solo per scrivere?

Grazie ancora!
:ciauz:

solefran
15-01-2006, 12:17
Ok, ho trovato un articolo interessante sui multithreading in c++ a questo link (http://gpad.gameprog.it/?resource=611)

Loading