Buonasera, è da poco che sto programmando con i socket e non riesco a capire dove è il mio sbaglio. Il programma dovrebbe fare questo:
- Il client inserisce da riga di comando una stringa e un numero (che sarà il numero X di volte che verrà inviata la stringa al server).
-Il server riceve nel suo buffer la stringa moltiplicata X volte e risponde al client semplicemente con al stringa (una sola volta)
-Il client stampa "Input X e stringa Y".
Questo è quello che ho provato a fare.
Server:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PORTA "11000"
#define MAXLINE 256
int main() {
int conta=0;
char buffer[256]="";
int simpleSocket = 0;
int simplePort = 0;
int returnStatus = 0;
int returnMessage = 1;
struct sockaddr_in simpleServer;
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Could not create a socket!\n");
exit(1);
}
else {
fprintf(stderr, "Socket created!\n");
}
/* retrieve the port number for listening */
simplePort = atoi(PORTA);
/* setup the address structure */
/* use INADDR_ANY to bind to all local addresses */
memset(&simpleServer, '\0', sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
//simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
simpleServer.sin_port = htons(simplePort);
/* bind to the address and port with our socket */
returnStatus = bind(simpleSocket,(struct sockaddr *)&simpleServer,sizeof(simpleServer));
if (returnStatus == 0) {
fprintf(stderr, "Bind completed!\n");
}
else {
fprintf(stderr, "Could not bind to address!\n");
close(simpleSocket);
exit(1);
}
/* lets listen on the socket for connections */
returnStatus = listen(simpleSocket, 5);
if (returnStatus == -1) {
fprintf(stderr, "Cannot listen on socket!\n");
close(simpleSocket);
exit(1);
}
while (1)
{
struct sockaddr_in clientName = { 0 };
int simpleChildSocket = 0;
int clientNameLength = sizeof(clientName);
/* wait here */
simpleChildSocket = accept(simpleSocket,(struct sockaddr *)&clientName, &clientNameLength);
if (simpleChildSocket == -1) {
fprintf(stderr, "Cannot accept connections!\n");
close(simpleSocket);
exit(1);
}
/* get the message from the client */
while(returnMessage>0){
returnMessage = read(simpleChildSocket, buffer, sizeof(buffer));
//printf("dentro al server %d: %s\n", returnMessage, buffer);
//memset(&buffer, '\0', MAXLINE);
conta++;
}
write(simpleChildSocket, &conta, 1);
write(simpleChildSocket, buffer, strlen(buffer));
memset(&buffer, '\0', MAXLINE);
close(simpleChildSocket);
}
close(simpleSocket);
return 0;
}
Client:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define INDIP "192.168.2.5"
#define PORTA "11000"
#define MAXLINE 256
int main() {
char s[256]="";
int Nstringhe=0;
int simpleSocket = 0;
int simplePort = 0;
int returnStatus = 0;
int messaggio=1;
char buffer[256] = "";
struct sockaddr_in simpleServer;
/* create a streaming socket */
simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (simpleSocket == -1) {
fprintf(stderr, "Could not create a socket!\n");
exit(1);
}
else {
fprintf(stderr, "Socket created!\n");
}
/* retrieve the port number for connecting */
simplePort = atoi(PORTA);
/* setup the address structure */
/* use the IP address sent as an argument for the server address */
//bzero(&simpleServer, sizeof(simpleServer));
memset(&simpleServer, '\0', sizeof(simpleServer));
simpleServer.sin_family = AF_INET;
//inet_addr(argv[2], &simpleServer.sin_addr.s_addr);
simpleServer.sin_addr.s_addr=inet_addr(INDIP);
simpleServer.sin_port = htons(simplePort);
/* connect to the address and port with our socket */
returnStatus = connect(simpleSocket, (struct sockaddr *)&simpleServer, sizeof(simpleServer));
if (returnStatus == 0) {
fprintf(stderr, "Connect successful!\n");
}
else {
fprintf(stderr, "Could not connect to address!\n");
close(simpleSocket);
exit(1);
}
printf("Quante volte vuoi inviare il messaggio? : ");
scanf("%d\n",&Nstringhe);
printf("Inserire la stringa: ");
gets(s);
while(Nstringhe>0){
/* write out our message to the server */
write(simpleSocket, s, strlen(s));
Nstringhe--;
}
/*get the message from the server*/
messaggio = read(simpleSocket, buffer, sizeof(buffer));
if ( messaggio > 0 ) {
printf("client %d: %s", messaggio, buffer);
} else {
fprintf(stderr, "Return client Status = %d \n", messaggio);
}
memset(&buffer, '\0', MAXLINE);
close(simpleSocket);
return 0;
}
Se mi riuscite a dare una dritta mi fareste un grandissimo favore, perchè sono proprio bloccato.
Grazie
Ciao!