winstonsmith
12-01-2005, 22:45
Hallo,
ich hoffe ihr könnt' mir helfen.
Ich dreh' hier bald durch.
Ich hab' ein Server- und ein Client-Programm geschrieben.
Der Server wartet auf eine eingehende Verbindung und schickt dann eine Datei paketweise an den Client.
Der Client baut eine Verbindung zum Server auf und empfängt dann diese Pakete und schreibt diese Pakete in eine Datei.
Problem ist nun, das der Client diese Pakte der Datei zwar alle empfängt aber er hört danach nicht auf Pakete in die Datei zu schreiben.
Hier ist mal der Code von beiden.
Zuerst der Server:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
#define MYPORT 3490 // the port users will be connecting to
#define BACKLOG 10 // how many pending connections queue will hold
#define MAXDATASIZE 672 // max number of bytes we can get at once
void sigchld_handler(int s)
{
while(wait(NULL) > 0)
;
}
int main(void)
{
char *filename="/home/Hans/chill-CD.k3b"; //Filename
int fd; //File-Descriptor
int rlen;
mode_t filemode= O_RDONLY; //File-Mode to open
int sockfd, new_sockfd; // listen on sock_fd, new connection on new_sockfd
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector s address information
int sin_size;
struct sigaction sa;
int yes=1;
char buf[MAXDATASIZE];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(&(my_addr.sin_zero), 0 , 8); // zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1)
{
perror("sigaction");
exit(1);
}
while(1)
{ // main accept() loop
sin_size = sizeof(struct sockaddr_in);
if ((new_sockfd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
if ((fd = open(filename, filemode)) < 0)
{
perror("Can't open input/output file");
return -1;
}
long i=0;
rlen=1;
while(rlen>0)
{
i++;
if ((rlen=read(fd, buf, MAXDATASIZE))<=0)
{
if (rlen==0)
{
printf("Datei zu Ende \n");
close(fd);
exit(1);*/
}
else
{
printf("Fehler beim Lesen\n");
}
}
else
{
if (send(new_sockfd, buf, sizeof(buf), 0) == -1)
{
perror("send");
}
else
{
printf("sequence-number: %d : %d Bytes to %s\n", i, rlen, inet_ntoa(their_addr.sin_addr));
}
}
printf("rlen=%d\n", rlen);
}
printf("Closing newsock_fd\n");
close(new_sockfd);
printf("Closing newsock_fd\n");
close(fd);
printf("fertig\n");
}
close(sockfd);
return(0);
}
Und hier der Client:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/socket.h>
#define PORT 3490 // the port client will be connecting to
#define MAXDATASIZE 672 // max number of bytes we can get at once
int main(int argc, char *argv[]) {
char *filename="/home/Hans/rage1.mp3"; //Filename
int fd; //File-Descriptor
int rlen;
mode_t filemode= O_RDWR | O_APPEND | O_CREAT; //File-Mode to create
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; // connector s address information
FILE *pipe_sco;
int pipefd;
if ((he=gethostbyname("Winston")) == NULL)
{ // get the host info
perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(PORT); // short, network byte order
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), 0 , 8); // zero the rest of the struct
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
printf("Client: Connecting to %s\n", inet_ntoa(their_addr.sin_addr));
int i=0;
numbytes=0;
if ((fd = open(filename, filemode,0644)) < 0)
{
perror("Can't open input/output file");
return -1;
}
while(numbytes!=-1)
{
if ((numbytes=recv(sockfd, buf, sizeof(buf), 0)) == -1) //MSG_WAITALL
{
perror("recv");
exit(1);
}
else
{
i++;
write(fd, buf, sizeof(buf));
printf("1. Received sequence number %d and numbytes= %d\n", i, numbytes);
}
}
close(fd);
close(sockfd);
pclose(pipe_sco);
return (0);
}
Ich hoff ihr wisst eine Lösung.
mfg
winstonsmith
ich hoffe ihr könnt' mir helfen.
Ich dreh' hier bald durch.
Ich hab' ein Server- und ein Client-Programm geschrieben.
Der Server wartet auf eine eingehende Verbindung und schickt dann eine Datei paketweise an den Client.
Der Client baut eine Verbindung zum Server auf und empfängt dann diese Pakete und schreibt diese Pakete in eine Datei.
Problem ist nun, das der Client diese Pakte der Datei zwar alle empfängt aber er hört danach nicht auf Pakete in die Datei zu schreiben.
Hier ist mal der Code von beiden.
Zuerst der Server:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
#define MYPORT 3490 // the port users will be connecting to
#define BACKLOG 10 // how many pending connections queue will hold
#define MAXDATASIZE 672 // max number of bytes we can get at once
void sigchld_handler(int s)
{
while(wait(NULL) > 0)
;
}
int main(void)
{
char *filename="/home/Hans/chill-CD.k3b"; //Filename
int fd; //File-Descriptor
int rlen;
mode_t filemode= O_RDONLY; //File-Mode to open
int sockfd, new_sockfd; // listen on sock_fd, new connection on new_sockfd
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector s address information
int sin_size;
struct sigaction sa;
int yes=1;
char buf[MAXDATASIZE];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)
{
perror("setsockopt");
exit(1);
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(&(my_addr.sin_zero), 0 , 8); // zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1)
{
perror("sigaction");
exit(1);
}
while(1)
{ // main accept() loop
sin_size = sizeof(struct sockaddr_in);
if ((new_sockfd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
if ((fd = open(filename, filemode)) < 0)
{
perror("Can't open input/output file");
return -1;
}
long i=0;
rlen=1;
while(rlen>0)
{
i++;
if ((rlen=read(fd, buf, MAXDATASIZE))<=0)
{
if (rlen==0)
{
printf("Datei zu Ende \n");
close(fd);
exit(1);*/
}
else
{
printf("Fehler beim Lesen\n");
}
}
else
{
if (send(new_sockfd, buf, sizeof(buf), 0) == -1)
{
perror("send");
}
else
{
printf("sequence-number: %d : %d Bytes to %s\n", i, rlen, inet_ntoa(their_addr.sin_addr));
}
}
printf("rlen=%d\n", rlen);
}
printf("Closing newsock_fd\n");
close(new_sockfd);
printf("Closing newsock_fd\n");
close(fd);
printf("fertig\n");
}
close(sockfd);
return(0);
}
Und hier der Client:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/socket.h>
#define PORT 3490 // the port client will be connecting to
#define MAXDATASIZE 672 // max number of bytes we can get at once
int main(int argc, char *argv[]) {
char *filename="/home/Hans/rage1.mp3"; //Filename
int fd; //File-Descriptor
int rlen;
mode_t filemode= O_RDWR | O_APPEND | O_CREAT; //File-Mode to create
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; // connector s address information
FILE *pipe_sco;
int pipefd;
if ((he=gethostbyname("Winston")) == NULL)
{ // get the host info
perror("gethostbyname");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(PORT); // short, network byte order
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), 0 , 8); // zero the rest of the struct
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
printf("Client: Connecting to %s\n", inet_ntoa(their_addr.sin_addr));
int i=0;
numbytes=0;
if ((fd = open(filename, filemode,0644)) < 0)
{
perror("Can't open input/output file");
return -1;
}
while(numbytes!=-1)
{
if ((numbytes=recv(sockfd, buf, sizeof(buf), 0)) == -1) //MSG_WAITALL
{
perror("recv");
exit(1);
}
else
{
i++;
write(fd, buf, sizeof(buf));
printf("1. Received sequence number %d and numbytes= %d\n", i, numbytes);
}
}
close(fd);
close(sockfd);
pclose(pipe_sco);
return (0);
}
Ich hoff ihr wisst eine Lösung.
mfg
winstonsmith