PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wieder einmal Connection-Probleme



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

winstonsmith
12-01-2005, 23:31
Ich hab daas Problem gelöst und zwar musste ich "numbytes" nicht auf 0 sondern auf 1 setzen und bei der while-Schleife vom Client die Abfrage auf


while (numbytes > 0)

ändern.
Und ich musste die If-Abfrage auf


if ((numbytes=recv(sockfd, buf, sizeof(buf), 0)) <= 0

ändern.

Jetzt hab' ich aber ein anderes Problem:

Beim letzten Paket, das ankommt meldet er immer den Fehler:

recv: Invalid or incomplete multibyte or wide character

Was bedeutet er und wie krieg ich den beseitigt?

mfg