PDA

View Full Version : [C] errore connect() TCP, visual c++ 2010 Express


Jocker_89
04-08-2012, 17:58
Aprendo due istanze di VS ho fatto partire i rispettivi .exe "Release" ma, mentre il Server svolge tutte le istruzioni fino a stampare sul prompt "Arrivato qua1.2", il client non supera la connect() stampando sul prompt "Errore connect al server".

Il server poi, quando ho compilato per la Release, mi aveva chiesto di poter effettuare connessioni nella rete domestica (io ho acconsentito), mentre il client non ha chiesto nulla.

Non sono in grado di vedere l'errore.
Il codice originario è una "traduzione" da una versione per GNU/Linux.

Riporto i frammenti di codice del server e del client.


Server:

#include "stdafx.h"
//#include "confsala.h"
//#include "helper.h"

//#include <Windows.h> /// sleep(milliseconds)

//#include <WinSock.h>

//#include <stdlib.h>


void main() {

SOCKET sock;
SOCKET sock_a; ///sock_a -> socket successivo all'accept

struct sockaddr_in server; /// socket address structure
struct sockaddr_in client; /// client address structure
char buff[MAX_DIM];



if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0 ){

printf("errore in WSAStartup()\n");
exit(EXIT_FAILURE);

}



if( ( sock = socket(AF_INET, SOCK_STREAM, 0) ) ==INVALID_SOCKET ){
printf("errore creazione socket\n");
getchar();
exit(1);
}


memset(&server, 0, sizeof(server)); // azzeramento valori del sockaddr_in server


server.sin_family = AF_INET;


server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(25000);


if( bind(sock, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR ){
printf("Errore bind \n");
getchar();
exit(1);
}

if( listen(sock, CODA) == SOCKET_ERROR ){
printf("Errore listen\n");
getchar();
exit(1);
}


printf("Arrivato qua1");

while(1) {
printf("Arrivato qua1.2");

length = sizeof(struct sockaddr_in);

if( (sock_a = accept(sock, (struct sockaddr*)&client, &length) ) == INVALID_SOCKET ){
printf(" Errore accept()\n");
getchar();
exit(1);
}


printf("Arrivato qua2");
...


client:

#include "stdafx.h"
//#include "confsala.h"
//#include "helper.h"

//#include <Windows.h> /// sleep(milliseconds)

//#include <WinSock.h>

//#include <stdlib.h>



void main() {
int ds_sock, length, res;
struct sockaddr_in server;

WSADATA wsaData; // struttura Windows Sockets API := informazioni riguardanti l'implementazione

char buff1[MAX_DIM];

if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0 ){

printf("errore in WSAStartup()\n");
exit(EXIT_FAILURE);

}

if ( (ds_sock = socket(AF_INET, SOCK_STREAM, 0) ) == INVALID_SOCKET) {
printf("errore creazione socket client\n");
getchar();
exit(1);
}

memset(&server, 0, sizeof(server));

server.sin_family = AF_INET;
server.sin_port = htons(25000);


server.sin_addr.s_addr =htonl(INADDR_ANY);



if( (res = connect(ds_sock,(struct sockaddr*) &server,sizeof(server)) ) == SOCKET_ERROR){
printf("Errore connect al server\n");
getchar();
exit(1);
}

...

Vi ringrazio per l'attenzione!

Jocker_89
04-08-2012, 23:57
Risolto purtroppo per tentativi.

Nella versione GNU/Linux del client è possibile inserire:

server.sin_addr.s_addr =htonl(INADDR_ANY);

mentre invece nella versione Windows devo inserire l'IP o "risolverlo":

client.sin_addr.s_addr = inet_addr("0.0.0.0");


Se qualcuno può spiegarmi il perchè gliene sarei immensamente riconoscente.


Che bel sabato sera.. :muro: :muro: