Hi everyone,
I'm using C Socket for a simple communication between an Ethernet Connection.
The two end points are: Notebook (it's the machine where the Server is running) and an FPGA (where the client should run), the protocol in use must be UDP.
I read on internet that it's possible to solve some problems of UDP by using the UDP with connection, so, that's what I'm trying to develop.
Below there is the code of server and client.
SERVER:
#define SERVERADDRESS "10.3.0.72"
#define MAXBUF 128
int main(int argc, char * argv[])
{
int server_socket, connect_socket, retcode, nw;
socklen_t client_addr_len;
struct sockaddr_in server_addr, client_addr;
char buffer[MAXBUF];
char * client_address; // lo useremo come indirizzo del client in formato stringa
// apertura socket del server
if (((server_socket = socket(PF_INET,SOCK_DGRAM,0))) == -1)
{
perror("Error in server socket()");
exit(-1);
}
// preparazione dell'indirizzo locale del server
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(0);
server_addr.sin_addr.s_addr = inet_addr(SERVERADDRESS);
memset(server_addr.sin_zero,'/0',sizeof(server_addr.sin_zero));
// bind del socket
if ((retcode = bind (server_socket, (struct sockaddr*) &server_addr, sizeof(server_addr))) == -1)
{
perror("Error in server socket bind()");
exit(-1);
}
// listen del socket
if ((retcode = listen(server_socket, 10)) == -1)
{
perror("Error in server socket listen()");
exit(-1);
}
printf("Server ready (CTRL-C quits)\n");
client_addr_len = sizeof(client_addr);
// cicla in attesa di connessione
while (1)
{
// accetta le connessioni
if ((connect_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len)) == -1)
{
perror("Error in accept()");
exit(-1);
}
// memorizzo l'indirizzo del client in formato stringa
client_address = inet_ntoa(client_addr.sin_addr);
printf("\nClient @ %s connects on socket %d\n", client_address, connect_socket);
// riceve i messaggi e li stampa in output
while ((retcode = recv(connect_socket,buffer,MAXBUF,0)) > 0)
{
buffer[retcode] = '\0'; // buffer dev'essere una stringa
printf(">> %s: %s\n", client_address, buffer);
}
// chiudo la socket
close(connect_socket);
}
}
CLIENT:
#define SERVERADDRESS "10.3.0.72"
int main(int argc, char *argv[])
{
int client_socket;
struct sockaddr_in server_addr;
char *msg = 'CIAO SONO IL CLIENT';
size_t msglen;
int retcode;
// preparo la variabile msg in base alla dimensione del messaggio inserito dall'utente
//msg = malloc(msg*sizeof(char));
// apertura socket del client
if ((client_socket = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("Error in socket()");
exit(-1);
}
// preparazione dell'indirizzo del server con cui connettere il socket
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(0);
server_addr.sin_addr.s_addr = inet_addr(SERVERADDRESS);
// connessione del socket al server
if ((connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr))) == -1)
{
perror("Error in connect()");
exit(-1);
}
printf("Client connected to %s\n", SERVERADDRESS);
// invio messaggio al server
msglen = strlen(msg)+1;
retcode = send(client_socket, msg, msglen,0);
printf("Sent %d (%u request) bytes on socket %d\n", retcode, (unsigned) msglen, client_socket);
}
When I try to run the Server application, I get this error "Error in server socket listen(): Operation not supported" I guess it's an error related to a wrong management of the UDP with connect().
Any suggestions?
Thanks in advance.