Сетевое программирование, отправка файла с клиента на сервер - PullRequest
0 голосов
/ 23 сентября 2019

Я действительно новичок в сети, я работаю с эхо-сервером и эхо-клиентом.В моей лаборатории у меня есть два компьютера, подключенных к сети, так что я могу проверить их после настройки через "ifconfig eth0 10.1.1.n (n - номер порта) netmask 255.255.255.0".

echo_server.c

 /* A simple echo server using TCP */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/signal.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

#define SERVER_TCP_PORT 3000    /* well-known port */
// #define BUFLEN       256 /* buffer length */

int echod(int);
void reaper(int);

int main(int argc, char **argv)
{
    int     sd, new_sd, client_len, port, confd = 0,b,tot;
    struct  sockaddr_in server, client;
    char buff[1025];

    switch(argc){
    case 1:
        port = SERVER_TCP_PORT;
        break;
    case 2:
        port = atoi(argv[1]);
        break;
    default:
        fprintf(stderr, "Usage: %d [port]\n", argv[0]);
        exit(1);
    }

    /* Create a stream socket   */  
    if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "Can't creat a socket\n");
        exit(1);
    }

    /* Bind an address to the socket    */
    bzero((char *)&server, sizeof(struct sockaddr_in));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(sd, (struct sockaddr *)&server, sizeof(server)) == -1){
        fprintf(stderr, "Can't bind name to socket\n");
        exit(1);
    }



    while(1) {
      confd = accept(sd, (struct sockaddr*)NULL, NULL);
        if (confd==-1) {
            perror("Accept");
            continue;
        }
        //Should create a text file.
        FILE* fp = fopen( "test.txt", "wb");
        tot=0;
        if(fp != NULL){
            while( (b = recv(confd, buff, 1024,0))> 0 ) {
                tot+=b;
                fwrite(buff, 1, b, fp);
            }

            printf("Received byte: %d\n",tot);
            if (b<0)
               perror("Error recieving the file");

            fclose(fp);
        } else {
            perror("File doesnt exist");
        }
        close(confd);
    }
}

echo_client.c

/* A simple echo client using TCP */
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <strings.h>


#define SERVER_TCP_PORT 3000    /* well-known port */
#define BUFLEN      256 /* buffer length */

int main(int argc, char **argv)
{
    int     n, i, bytes_to_read, b;
    int     sd, port;
    struct  hostent     *hp;
    struct  sockaddr_in server;
    char    *host, *bp, rbuf[BUFLEN], sbuf[BUFLEN], sendbuffer[100];

    switch(argc){
    case 2:
        host = argv[1];
        port = SERVER_TCP_PORT;
        break;
    case 3:
        host = argv[1];
        port = atoi(argv[2]);
        break;
    default:
        fprintf(stderr, "Usage: %s host [port]\n", argv[0]);
        exit(1);
    }

    /* Create a stream socket   */  
    if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "Can't creat a socket\n");
        exit(1);
    }

    bzero((char *)&server, sizeof(struct sockaddr_in));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    if (hp = gethostbyname(host)) 
      bcopy(hp->h_addr, (char *)&server.sin_addr, hp->h_length);
    else if ( inet_aton(host, (struct in_addr *) &server.sin_addr) ){
      fprintf(stderr, "Can't get server's address\n");
      exit(1);
    }

    /* Connecting to the server */
    if (connect(sd, (struct sockaddr *)&server, sizeof(server)) == -1){
      fprintf(stderr, "Can't connect \n");
      exit(1);
    }

    FILE *fp = fopen("test.txt", "rb");

    if(fp == NULL){
        perror("File doesnt exist");
        return 2;
    }

    while( (b = fread(sendbuffer, 1, sizeof(sendbuffer), fp))>0 ){
        send(sd, sendbuffer, b, 0);
    }

    fclose(fp);

    close(sd);
    return(0);
}

Я пытаюсь отправить текстовый файл с клиента на сервер при выполнении сценарияэто запустить.Для запуска сценария я указываю номер порта.

Когда я выполняю сценарий сервера, я получаю Accept: Invalid argument.Похоже, что в цикле, поэтому я получаю более сотни таких выводов.В этот момент мне нужно выйти из терминала.

Есть ли какие-либо замечания или советы относительно того, как я могу отправить файл с клиента на сервер при выполнении сценария?

1 Ответ

1 голос
/ 23 сентября 2019

Прежде чем позвонить accept (2) , вам нужно позвонить listen (2) , чтобы пометить сокет как сокет сервера, который будет использоваться для приема входящих запросов на соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...