Є сервер
#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>
#define BUFSZ 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){
n=recv(sock,buf,100,0);
};
return n;
};
int write_sock(int sock,char *buf)
{
int n=0;
if(buf!=NULL){
n=send(sock,buf,100,0);
};
return n;
};
void sock_connect(int i,char *hnm);
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
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)
{
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);
int s2, sz2, i2;
struct sockaddr_in ssa2;
struct sockaddr *sp2;
struct in_addr sip2;
struct hostent *htn2;
struct in_addr **adl2;
static char hnm2[25];
static char hna2[25];
for(;;){
signal(SIGALRM,sigalrm1);
sp2=(struct sockaddr *)&ssa2;
sz2=sizeof(ssa2);
if(argc!=2){
// Помощь по использованию команды
printf("Р˜СЃРїРѕР»СЊР·РѕРІР°РЅРёРµ: %s ip-адрес\n",argv[0]);
exit(1);
}
if(inet_aton(argv[1], &sip2) != 1){
printf("Неправильно задан адрес сервера\n");
exit(1);
}
while(1)
{
// Создаём сокет
s2=socket(AF_INET, SOCK_STREAM, 0);
if(s2 == -1){
// perror("Невозможно создать сокет");
}
// Задаём адрес сервера
ssa2.sin_family = AF_INET;
ssa2.sin_port = htons(5064);
ssa2.sin_addr = sip2;
static char cmbf[100];
// gets(cmbf);
// Устанавливаем соединение
if(connect(s2, sp2, sz2) == -1){
// perror("Не удалось установить соединение");
} else {
static char buf[BUFSZ];
//static char fbuf[10000];
int i2=0;
static char fbuf[1000];
// Получаем данные от сервера
recv(s2,fbuf,sizeof(fbuf),0);
printf("%s\n",fbuf);
sleep(15);
close(s2);
};
}
};
return 0;
};
void *pthr1(void *)
{
signal(SIGALRM,sigalrm1);
sp=(struct sockaddr *)&ssa;
cp=(struct sockaddr *)&csa;
sz=sizeof(ssa);
// Создаём сокет
s=socket(AF_INET, SOCK_STREAM, 0);
if(s == -1){
perror("Невозможно создать сокет");
}
// Резервируем порт 13
ssa.sin_family = AF_INET;
ssa.sin_port = htons(5063);
ssa.sin_addr.s_addr = INADDR_ANY;
if(bind(s, sp, sz) == -1){
perror("Невозможно занять порт");
exit(1);
}
printf("fuck\n");
// Переводим сокет в режим ожидания соединения
if(listen(s, 1) == -1){
perror("Невозможно перейти в режим ожидания");
exit(1);
}
while(1){
// Принимаем соединение
if((c = accept(s, cp, &sz)) == -1) {
perror("Ошибка при выполнении accept");
exit(1);
}
printf("$ ");
char *tstr=new char[255];
gets(tstr);
int i=0;
// Отправляем дату и время клиенту
write_sock(c,tstr);
// Закрываем соединение
close(c);
}
};
Є кліент
#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>
#include <signal.h>
#define BUFSZ 128
static char fbuf[1000];
void siga(int num)
{
return;
};
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,strlen(fbuf),0);
return n;
};
int s, sz, i;
struct sockaddr_in ssa;
struct sockaddr *sp;
struct in_addr sip;
int s2, c2;
socklen_t sz2;
struct sockaddr_in ssa2, csa2;
struct sockaddr *sp2, *cp2;
struct hostent *rhost2;
char *host2;
struct hostent *htn2;
struct in_addr **adl2;
static char hnm2[25];
static char hna2[25];
void sock_connect(int i,char *hnm);
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
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("Client thread 1\n");
} else
{
perror("thread 1");
exit(1);
};
printf("aaa");
for(;;){
signal(SIGALRM,siga);
sp2=(struct sockaddr *)&ssa2;
cp2=(struct sockaddr *)&csa2;
sz2=sizeof(ssa2);
// Создаём сокет
s2=socket(AF_INET, SOCK_STREAM, 0);
if(s2 == -1){
//perror("Невозможно создать сокет");
}
// Резервируем порт 13
ssa2.sin_family = AF_INET;
ssa2.sin_port = htons(5064);
ssa2.sin_addr.s_addr = INADDR_ANY;
if(bind(s2, sp2, sz2) == -1){
//perror("Невозможно занять порт");
}
// Переводим сокет в режим ожидания соединения
if(listen(s2, 1) == -1){
// perror("Невозможно перейти в режим ожидания");
}
while(1){
// Принимаем соединение
if((c2 = accept(s2, cp2, &sz2)) == -1) {
//perror("Ошибка при выполнении accept");
}
// Преобразуем адрес хоста отправителя в его имя
int i=0;
send(c2,fbuf,sizeof(fbuf),0);
sleep(15);
close(c2);
// Отправляем дату и время клиенту
// Закрываем соединение
}
};
return 0;
};
void *pthr1(void *)
{
signal(SIGALRM,siga);
sp=(struct sockaddr *)&ssa;
sz=sizeof(ssa);
printf("%s\n",av[1]);
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(5063);
ssa.sin_addr.s_addr = inet_addr(av[1]);
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);
if(fdb==-1)
{
perror("open");
exit(0);
} else {
read(fdb,fbuf,sizeof(fbuf));
write(1,fbuf,sizeof(fbuf));
close(fdb);
};
}
};
Є мейкфайл
server.o: server.cpp
g++ -c server.cpp
g++ -lpthread -o server server.o
client.o: client.cpp
g++ -c client.cpp
g++ -lpthread -o client client.o
all: server.o client.o
clean:
rm server
rm client
rm *.o
Спочатку запускается сервер з вказанням в параметрі командної строки IP адресси кліента, а потім запускается на іншому хості кліент с указанням IP адресси сервера. Потім на сервері набираются команди які віконуются на кліенті. Перед запуском треба відключити firewall iptables
/etc/rc.d/init.d/iptables stop. Перевірити щоб порт 5000 і 5001 були не зайняті.