Salve a tutti. Ho sviluppato una banalissima applicazione client server.
Il problema è che la connect nel client mi restituisce -1, quindi un errore (errno=58), mentre dal lato server la accept restituisce (0) e riesco a vedere l'indirizzo del client che ha richiesto la connessione come se la connessione la avesse stabilita. Tuttavia essendo che la connect al client abbia restituito errore, credo proprio la connessione stabilita non sia, difatti la applicazione server non riesce poi ad eseguire la recv().
Quale potrebbe essere l'origine del problema? E quale la soluzione? Grazie.
il server è sul PC in ambiente windows, il client su un microprocessore alloggiato su un dispositivo di sincronizzazione IEEE1588.
Se la connect lato client da errore, perché la accept lato server non lo da?
L'errore è ESHUTDOWN. Quindi credo sia la socket del client ad andare in shutdown.
Cosa strana:
Lancio l'applicazione server, poi lancio la applicazione client e il server pare ad esso connettersi, difatti la accept non da errore ed in più il server riesce a leggere correttamente IP e porta del chiamante. Poi non riesce a effettuare la recv() e rimane in attesa. Dal lato client intanto la connect() aveva restituito "-1".
Se poi lascio aperta l'app client e riavvio l'applicazione server, riesce a fare la recv() restituendo però errore.
========================================================
SERVER
========================================================
#include <iostream>
#include <winsock.h>
using namespace std;
int main(int argc, char *argv[])
{
int listenSocket;
int remoteSocket;
SOCKADDR_IN Server_addr;
SOCKADDR_IN Client_addr;
int sin_size;
short port;
char buffer[256];
int wsastartup;
int ls_result;
WORD wVersionRequested = 0x0202;
WSADATA wsaData;
wsastartup = WSAStartup(wVersionRequested, &wsaData);
if (wsastartup != NO_ERROR) printf ("Errore WSAStartup()\n\n");
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket < 0) printf ("Server: errore nella creazione del socket.\n\n");
else printf ("Creazione server socket correttamente effettuata: socket pronta.\n\n");
port = 6000;
Server_addr.sin_family = AF_INET;
Server_addr.sin_addr.s_addr = inet_addr("169.254.142.1");//inet_addr() converte una stringa contenente un indirizzo IP nella forma opportuna per essere memorizzato nella struttura in_addr.
Server_addr.sin_port = htons(port);
if (bind(listenSocket,(LPSOCKADDR) &Server_addr,sizeof(struct sockaddr)) < 0)
{
printf ("bind() fallita.\n\n");
closesocket(listenSocket);
system("pause");
return -1;
}
int rec;
ls_result = listen(listenSocket, SOMAXCONN);
if (ls_result < 0) printf ("Il server non riesce a mettersi in attesa...\n\n");
else printf ("Server in attesa di connessione...\n\n");
sin_size = sizeof(struct sockaddr_in);
while (1)
{
printf ("\nwhile...");
remoteSocket = accept(listenSocket, (struct sockaddr *) &Client_addr, &sin_size);
printf ("remote socket= %d.\n", remoteSocket);
printf ("Connessione al client (IP: %s; PORTA: %d) avvenuta con successo",inet_ntoa(Client_addr.sin_addr),ntohs(Client_addr.sin_port));
printf ("\nremote socket= %d.\n", remoteSocket);
rec=recv(remoteSocket, buffer, sizeof(buffer), 0);
printf("\nREC= %d ; errno= %d.", rec, errno);
printf ("\n\nL'identificatore della socket remota e': %d", remoteSocket);
printf ("\n\nMessaggio Arrivato: %s",buffer);
printf ("\n\nIl server sta per essere chiuso.\n\n");
}
WSACleanup();
system("pause");
return 0;
}
=========================================================
CLIENT
=========================================================
#include <socket.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int iprintf(const char *format, ...);
void sample_c_program(void)
{
char messaggio[4]="ciao";
iprintf("Benvenuto!\n");
short port;
int clientsocket;
struct sockaddr_in addr;
port=6000;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("169.254.142.1");
addr.sin_port = htons(port);
clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/* if (clientsocket<0)
{
iprintf("Errore nella funzione socket(): %ld\n", errno);
// return;
} */
iprintf("L'identificatore della socket del client è: %d \n", clientsocket);
int con=-1;
/* while (con<0)
con=connect(clientsocket, (struct sockaddr*) &addr, sizeof(addr));
iprintf("vediamo un po"); */
if(connect(clientsocket, (struct sockaddr*) &addr, sizeof(addr))<0)
{
iprintf("Errore %d nella connessione con il Server.\n", errno);
// closesocket(clientsocket);
// return;
}
int bytesSent;
bytesSent=send(clientsocket, messaggio, sizeof(messaggio), 0);
printf( "\n\nBytes Sent: %ld\n", bytesSent );
// shutdown(clientsocket,2);
// closesocket(clientsocket);
return;
}
===================================================================================