Pisze program klient-serwer echo pod Linuxem.
Bezpołączeniowo, na datagramach:
socket(AF_INET,DGRAM,0)
Programy sie kompiluja bez bledow, gdy w kliencie wpisze jakikolwiek tekst, serwer go zwroci, tak jak powinien, lecz funkcja recv() zwraca blad:
Bad file descriptor
i sie wyłącza.
Wie ktoś może jaki popełniłem bląd??
oto serwer:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#define SERVER_PORT 1500
#define MAX_MSG 100
int main()
{
char line[MAX_MSG];
int sd, n;
socklen_t cliLen;
struct sockaddr_in cliAddr, servAddr;
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd < 0)
{
perror("socket");
exit(1);
}
memset(&servAddr,0x0,sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(SERVER_PORT);
if(bind(sd,(struct sockaddr*) &servAddr, sizeof(servAddr))<0)
{
perror("bind");
exit(1);
}
for(;;)
{
cliLen = sizeof(cliAddr);
memset(line,0x0,MAX_MSG);
n = recvfrom(sd,line,MAX_MSG,0,(struct sockaddr*) &cliAddr,&cliLen);
if(n<0)
{
perror("recvfrom");
exit(1);
}
sendto(sd,line,n,0,(struct sockaddr*) &cliAddr,cliLen);
close(sd);
}
exit(0);
}
oto klient:
#include <stdio.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#define MAX_LEN 100
#define SERWER_PORT 1500
int main (int argc, char **argv)
{
if (argc!=2)
{
printf("Uzycie: %s adres\n",argv[0]);
exit(1);
}
int len = 0, gniazdo;
struct sockaddr_in serwer_adres;
char cmd[MAX_LEN],odp[MAX_LEN];
if ((gniazdo = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
{
perror("socket");
exit(1);
}
memset(&serwer_adres,0,sizeof(serwer_adres));
serwer_adres.sin_family = AF_INET;
serwer_adres.sin_addr.s_addr = inet_addr(argv[1]);
serwer_adres.sin_port = htons(SERWER_PORT);
struct hostent *host;
host = gethostbyname(argv[1]);
if (host == NULL)
{
printf("Nieznany host '%s'\n", argv[1]);
exit(1);
}
serwer_adres.sin_family = host->h_addrtype;
memcpy((char*) &serwer_adres.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
serwer_adres.sin_port = htons(SERWER_PORT);
printf("> ");
memset(odp, 0x0, MAX_LEN);
fgets(cmd,sizeof(cmd),stdin);
len = strlen(cmd);
if (len > 0) cmd[len-1]=0;
if((sendto(gniazdo, cmd, len, 0, (struct sockaddr*)&serwer_adres,sizeof(serwer_adres)))==-1)
{
perror("sendto");
exit(1);
}
if ((len = recvfrom(gniazdo, odp, MAX_LEN, 0, NULL, NULL))==-1)
{
perror("recvfrom");
exit(1);
}
printf("echo> %s\n",odp);
close(gniazdo);
exit(0);
}