-3
1つのクライアントサーバー接続で複数のファイルを送信したいと思います。サーバーはクライアントからの接続を受け入れてから、フォルダーをループしてそこのすべてのファイルをクライアントに送信する必要があります。これを行う良い方法は、クライアントが各ファイルを受信した後に保存し、次のファイルを正しく読み取れるようにすることです。1つの接続クライアントサーバーで複数のファイルを送信するC
以下のサーバーコードが1つのファイルのみを送信して閉じます。
/*
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;
}
質問は何ですか? –
クライアントが2つのファイルを区別できるように、ファイルの開始と終了を定義する通信プロトコルを定義する必要があります。これは、ファイルを送信する前にファイルのサイズを送信するのと同じくらい単純かもしれません。 – user4581301
@ JakeFreemanどのように複数のファイルを1つの接続で送信するためのサーバーコードを記述しますか? – bakalolo