Vi chiedo se qualcuno di voi ha del codice esemplificativo da passarmi per fare questo in C su una macchina che usa UBUNTU.
Parliamo di "Linux" è la stessa cosa
Io molto tempo fa feci questo esercizio:
Codice client:
codice:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<bits/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<netdb.h>
int main(int argc, char *argv[])
{
int clientSocket;
char msg_buffer[256] = "";
struct sockaddr_in client;
if(argc!=3)
{
fprintf(stderr, "\nusage: ./simple_client <server> <port nº>\n\n");
return -1;
}
if((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))!=-1)
fprintf(stdout, "\nSocket Created!\n");
else
fprintf(stderr, "\nError creating socket...\n");
bzero(&client, sizeof(client));
client.sin_family = AF_INET;
inet_aton(argv[1], NULL);
client.sin_port = htons(atoi(argv[2]));
if((connect(clientSocket, (struct sockaddr *)&client, sizeof(client))) != -1)
fprintf(stdout, "Connected successfully to server!\n");
else
{
fprintf(stderr, "Error connecting to server...\n");
close(clientSocket);
exit(-1);
}
if((read(clientSocket, msg_buffer, sizeof(msg_buffer))!=-1))
fprintf(stdout, "\nMessage received:\n<\"%s\">\n", msg_buffer);
else
fprintf(stderr, "Error receiving message...\n");
close(clientSocket);
return 0;
}
Codice server
codice:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<bits/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<netdb.h>
#define MAX_CONNECTIONS 5
const char message[100] = "I'm the server...";
int main(int argc, char *argv[])
{
int serverSocket;
struct sockaddr_in server;
if(argc!=2)
{
fprintf(stderr, "\nusage: ./simple_server <port nº>\n\n");
return -1;
}
if((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))!=-1)
fprintf(stdout, "\nSocket created!\n");
else
fprintf(stderr, "\nError creating socket...\n");
bzero(&server, sizeof(server));
/*important set this parameters correctly*/
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(atoi(argv[1]));
if((bind(serverSocket, (struct sockaddr *)&server, sizeof(server))) != -1)
fprintf(stdout, "Binding successfull!\n");
else
fprintf(stderr, "Binding Error...\n");
/*listen for connections*/
if((listen(serverSocket, MAX_CONNECTIONS))!=-1)
fprintf(stdout, "Accepting connection on port %s\n", argv[1]);
else
{
fprintf(stderr, "Error accepting connection on port %s\n", argv[1]);
exit(-1);
}
/*accepting incoming connections */
while(1)
{
struct sockaddr_in client;
int clientSocket;
int clientLength = sizeof(client);
if((clientSocket = accept(serverSocket, (struct sockaddr *)&client, (socklen_t*)&clientLength))!=-1)
{
if((write(clientSocket, message, strlen(message)))!=-1)
{
fprintf(stdout, "\nMessage sent successfully!\n\n");
}
}
else
{
fprintf(stderr, "Error sending message...\n");
exit(1);
}
close(clientSocket);
break;
}
fprintf(stdout, "Closing socket on port %s\n", argv[1]);
close(serverSocket);
fprintf(stdout, "#It's suggested wait few seconds to repeat the program ON THE SAME PORT,\n\tfor successfully re-execution.\n#Other port doesn't matter...\n\n");
return 0;
}
Non usa una struttura come chiedi ti e usa una connessione locale sulla stessa macchin 127.0.0.1 (pero questo ultimo dettaglio è irrilevante, lo puoi lanciare anche da 2 pc differenti connessi tra loro) pero si basa sull'invio e ricezione di un messaggio. Spero che ti possa essere utile.
Lanci il codice server e come argomento al main un nº di porta.
Lanci il codice client con l'indirizzo del server (127.0.0.1) e lo stesso nº di porta.