Ich möchte mehrere Dateien auf einem einzelnen Client-Server verbinden. Der Server sollte eine Verbindung vom Client akzeptieren und dann einen Ordner durchlaufen und jede Datei dorthin zum Client senden. Was ist eine gute Möglichkeit, dies zu tun, damit der Client jede Datei speichern kann, nachdem sie sie erhalten hat, und dann die nächste Datei korrekt lesen.Senden mehrerer Dateien in einem Client-Server-Verbindung C
Ich habe den folgenden Server-Code, der nur 1 Datei sendet und schließt.
/*
Server side C/C++ program to demonstrate Socket programming
compile:
gcc serverFile.c -o serverFile
run:
./serverFile
from http://www.geeksforgeeks.org/socket-programming-cc/
*/
#include <stdio.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#define PORT 8080
int main(int argc, char const *argv[])
{
char *file_path = "image.jpg";
int input_file;
input_file = open(file_path, O_RDONLY);
if (input_file == -1) {
exit(EXIT_FAILURE);
}
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// Creating socket file descriptor. AF_INET is IPv4, SOCK_STREAM is tcp.
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
//Set socket option (optional?). SOL_SOCKET is socket level argument.
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address))<0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
// If you want to read multiple server connections.
//int x;
//for (x = 0; x < 3; x++){
if (listen(server_fd, 3) < 0)
{
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
valread = read(new_socket , buffer, 1024);
printf("%s\n",buffer);
/*********************** read file and send it over socket ****************************/
//unsigned char buffer[1000];
while (1) {
// Read data into buffer. We may not have enough to fill up buffer, so we
// store how many bytes were actually read in bytes_read.
int bytes_read = read(input_file, buffer, sizeof(buffer));
if (bytes_read == 0) // We're done reading from the file
break;
if (bytes_read < 0) {
// handle errors
printf("read error!\n");
}
// You need a loop for the write, because not all of the data may be written
// in one call; write will return how many bytes were written. p keeps
// track of where in the buffer we are, while we decrement bytes_read
// to keep track of how many bytes are left to write.
void *p = buffer;
while (bytes_read > 0) {
int bytes_written = write(new_socket, p, bytes_read);
if (bytes_written <= 0) {
// handle errors
}
bytes_read -= bytes_written;
p += bytes_written;
}
}
/***************************************************************************************/
//send(new_socket , hello , strlen(hello) , 0);
//printf("Hello message sent\n");
close(new_socket);
close(server_fd);
//}
return 0;
}
Was ist die Frage? –
Sie müssen ein Kommunikationsprotokoll definieren, das definiert, wann eine Datei beginnt und endet, damit der Client zwei Dateien unterscheiden kann. Dies kann so einfach sein wie das Senden der Dateigröße vor dem Senden der Datei. – user4581301
@JakeFreeman Wie schreibe ich einen Servercode, um mehrere Dateien in einer Verbindung zu senden? – bakalolo