Я действительно новичок в сети, я работаю с эхо-сервером и эхо-клиентом.В моей лаборатории у меня есть два компьютера, подключенных к сети, так что я могу проверить их после настройки через "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
.Похоже, что в цикле, поэтому я получаю более сотни таких выводов.В этот момент мне нужно выйти из терминала.
Есть ли какие-либо замечания или советы относительно того, как я могу отправить файл с клиента на сервер при выполнении сценария?