Hallo,
ich stehe gerade vor dem Problem eine Datei mittels C-Programm zwischen zwei Computern übertragen zu müssen. Das heißt, die Übertragung klappt grundsätzlich auch, aber nicht so wie ich mir das vorstelle. Ich bräuchte nämlich einmal einen Server der durchgehend auf einem bestimmten Port lauscht, wartet bis sich ein Client verbindet, die Datei entgegen nimmt und dann weiter lauscht. Hier ist mein bisheriger Versuch:
#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <netdb.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <arpa/inet.h>int main(void) { int sockfd = 0; int bytesReceived = 0; int BUFFERSIZE = 1024; int TCP_RECV_ARCHIVE_PORT = 50010; char recvBuff[BUFFERSIZE]; memset(recvBuff, '0', sizeof(recvBuff)); struct sockaddr_in serv_addr; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("error: fetchDataAndExecute: could not create socket"); return 1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(TCP_RECV_ARCHIVE_PORT); serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) { printf("error: fechDataAndExecute: Connect failed."); return 1; } FILE *fp; fp = fopen("test.file", "ab"); if (fp == NULL) { printf("error: fetchDataAndExecute: Unable to open file"); return 1; } while ((bytesReceived = read(sockfd, recvBuff, BUFFERSIZE)) > 0) { printf("debug: fetchDataAndExecute: received %d Bytes. \n", bytesReceived); fwrite(recvBuff, 1, bytesReceived, fp); } if (bytesReceived < 0) { printf("error: fetchDataAndExecute: Error in data transfer"); return 1; } fclose(fp); return 0;}
und
void *sendFile(void *args) {
int listenfd = 0;
int connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[BUFFERSIZE];
int numrv;
int write_error = 0;
printf("%u \n", BUFFERSIZE);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0) {
critErr("error: master: sendFile: unable to create socket \n");
}
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
serv_addr.sin_family = AF_INET; // use IPv4
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); // answer to any IP address
serv_addr.sin_port = htons(TCP_RECV_ARCHIVE_PORT); // listen to TCP_RECV_ARCHIVE_PORT
bind(listenfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr));
if (listen(listenfd, 10) == -1){
critErr("error: master: sendFile: unable to listen \n");
}
while(1) {
connfd = accept(listenfd, (struct sockaddr*) NULL, NULL);
FILE *fp = fopen("test.file", "rb"); // TODO: Set appropriate file name
if (fp == NULL) { // if file couldn't be opened
printf("error: master: sendFile: unable to open file \n");
}
while(1) {
unsigned char buff[BUFFERSIZE] = {0}; // try to read file
int nread = fread(buff, 1, BUFFERSIZE, fp);
printf("debug: master: sendFile: Bytes read: %d \n", nread);
if (nread > 0 ) { // if reading of file was successful, send data
write_error = write(connfd, buff, nread);
}
if (nread > BUFFERSIZE) {
if (feof(fp)) {
printf("debug: master: sendFile: End of file \n");
}
if (ferror(fp)) {
printf("error: master: sendFile: Error while reading file \n");
}
break;
}
else if ( nread == 0) {
close(connfd);
break;
}
close(connfd);
sleep(1);
}
}
}
Alles anzeigen
Das übertragt die Datei (oder hat es zumindest so ähnlich bereits getan, evtl. mittlerweile "kaputt gespielt"), allerdings nur wenn der Empfänger dies anfordert. Der Empfänger soll aber nur lauschen und warten bis was vom Sender kommt. Allerdings bin ich damit schon den halben Nachmittag beschäftigt und stehe irgendwie auf dem Schlauch. Kann mir jemand sagen wo der Fehler liegt oder hat vielleicht jemand ein funktionierendes Beispiel wie es richtig geht?
Edit: Wie ich dieser Präsentation entnehmen konnte ist wohl listen() das wonach ich suche. Aber wie geht das genau?