Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>
#include <signal.h>
#include <ctype.h>
static char fbuf[100];
void sigalrm1(int num)
{
};
int s, c;
socklen_t sz;
struct sockaddr_in ssa, csa;
struct sockaddr *sp, *cp;
struct hostent *rhost;
char *host;
time_t itime;
int read_sock(char *buf,int sock)
{
int n=0;
if(buf!=(char)NULL){
alarm(10);
n=recv(sock,buf,100,0);
};
return n;
};
int write_sock(int sock,char *buf)
{
int n=0;
if(buf!=NULL){
alarm(10);
n=send(sock,buf,100,0);
};
return n;
};
void *pthr1(void *a1);
int ffd;
struct hostent *htn;
struct in_addr **adl;
static char hnm[25];
static char hna[25];
int main(int argc,char **argv)
{
signal(SIGALRM,sigalrm1);
pthread_attr_t pa1,pa2;
pthread_t pt1,pt2;
void *arg1;
void *arg2;
pthread_attr_init(&pa1);
pthread_attr_init(&pa2);
int pr=pthread_create(&pt1,&pa1,pthr1,NULL);
if(pr==0)
{
printf("Server thread \n");
} else
{
perror("thread 1");
exit(1);
};
sleep(10);
for(;;){};
return 0;
};
void *pthr1(void *)
{
sp=(struct sockaddr *)&ssa;
cp=(struct sockaddr *)&csa;
sz=sizeof(ssa);
// Создаём сокет
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == -1){
perror("Невозможно создать сокет");
exit(1);
}
// Резервируем порт 13
ssa.sin_family = AF_INET;
ssa.sin_port = htons(5000);
ssa.sin_addr.s_addr = INADDR_ANY;
if(bind(s, sp, sz) == -1){
perror("Невозможно занять порт");
exit(1);
}
// Переводим сокет в режим ожидания соединения
if(listen(s, 0) == -1){
perror("Невозможно перейти в режим ожидания");
exit(1);
}
while(1){
if((c = accept(s, cp, &sz)) == -1) {
perror("Ошибка при выполнении accept");
exit(1);
} rhost=gethostbyaddr((char*)(&csa.sin_addr),
sizeof(csa.sin_addr), AF_INET);
if(h_errno){
printf("gethostbyaddr error: %d\n", h_errno);
host=inet_ntoa(csa.sin_addr);
} else {
host=rhost->h_name;
}
printf("$ ");
char *tstr=new char[255];
gets(tstr);//считую команду с консоли
int i=0;
//передаю на клиент считаную команду
write_sock(c,tstr);
//это неработает (получаем пакет от клиента с выводом команды)
read_sock(fbuf,c);
printf("%s\n",fbuf);
close©;
}
};
Вот клиент который выполняет команду преданную сервером и направляет вывод в файл который затем считывает и должен отправить серверу но это неработает который должен это отобразить printf.
Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <pthread.h>
#define BUFSZ 128
static char fbuf[100];
int read_sock(char *buf,int sock)
{
int n=0;
if(buf!=NULL){
n=recv(sock,buf,100,0);
};
return n;
};
int write_sock(int sock)
{
int n=0;
n=send(sock,fbuf,100,0);
return n;
};
int s, sz, i;
struct sockaddr_in ssa;
struct sockaddr *sp;
struct in_addr sip;
void *pthr1(void *a1);
int ffd;
struct hostent *htn;
struct in_addr **adl;
static char hnm[25];
static char hna[25];
int ac;
char **av;
int main(int argc,char **argv)
{
ac=argc;
av=argv;
pthread_attr_t pa1;
pthread_t pt1;
void *arg1;
pthread_attr_init(&pa1);
int pr=pthread_create(&pt1,&pa1,pthr1,NULL);
if(pr==0)
{
printf("Create a thread 1\n");
} else
{
perror("thread 1");
exit(1);
};
for(;;){};
return 0;
};
void *pthr1(void *)
{
sp=(struct sockaddr *)&ssa;
sz=sizeof(ssa);
if(ac!=2){
// Помощь по использованию команды
printf("Р˜СЃРїРѕР»СЊР·РѕРІР°РЅРёРµ: %s ip-адрес\n",av[0]);
exit(1);
}
if(inet_aton(av[1], &sip) != 1){
printf("Неправильно задан адрес сервера\n");
exit(1);
}
while(1)
{
// Создаём сокет
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == -1){
perror("Невозможно создать сокет");
exit(1);
}
// Задаём адрес сервера
ssa.sin_family = AF_INET;
ssa.sin_port = htons(5000);
ssa.sin_addr = sip;
static char cmbf[100];
// gets(cmbf);
// Устанавливаем соединение
if(connect(s, sp, sz) == -1){
perror("Не удалось установить соединение");
exit(1);
}
static char buf[BUFSZ];
//static char fbuf[10000];
for(int j=0;j<=BUFSZ;j++)
{
buf[j]=(char)0x20;
};
// Получаем данные от сервера
while((i=read_sock(buf,s)) > 0)
write(1, buf, i);
i=0;
strcat(buf," >> ./f1.txt");// перенаправляет стандартный вывод в файл
system(buf);//выполняет команду переданную сервером
int fdb=open("./f1.txt",O_RDWR | O_CREAT);//открываю файл с выводом команды
if(fdb==-1)
{
perror("open");
exit(0);
} else {
read(fdb,fbuf,sizeof(fbuf));//считую в буффер содержимое файла
write_sock(s);//это неработает (посылаю серверу ответ с выводом команды)
close(fdb);
};
}
};
При посылке сервером считаной команды клиент принимает и выполняет её нормально, а обратная передача клиентом вывода команды посылает ответ, а сервер ничего непринимает. Может ли клиент и принимать так и отсылать данные или только принимать, а сервер только читать?Или мне нужно чтоб обратно передать данные считаной с файла результат выполнения команды нужно чтоб клиент создал внутри сервер, а сервер создал клиент?