Взаимодействие программ клиента и сервера (Ламерский вопрос)

Модератор: Модераторы разделов

Аватара пользователя
MumiyTroll2008
Сообщения: 28
ОС: WinXP + куча *nix-ов

Взаимодействие программ клиента и сервера

Сообщение MumiyTroll2008 »

Помогите разобратся с тем, как запустить в одной операционной системе программу-клиен и программу-сервер, желательно поподробнее я чайник и только изучаю UNIX и сетевые технологии и программирование под них

Примеры взяты из книги А Робачевского, скомпилированы в исполняемые файлы а вот вместе запустить в одной оси на взаимодействие незнаю как, может нужно как то вместе запускать и параметры еще каки-то задавать, ну в обще подскажите как правильно, если несложно. :rolleyes:

Вот исходники, если нужно.

Сервер:

Код:

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <fcntl.h> #include <netdb.h> #define PORTNUM 1500 main(argc, argv) int argc; char *argv[]; { int s, ns; int pid; int nport; struct sockaddr_in serv_addr, clnt_addr; struct hostent *hp; char buf[80], hname[80]; nport = PORTNUM; nport = htons((u_short)nport ); if((s=socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("РћС?РёР±РєР° вызова socket()"); exit(1); } bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = nport; if(bind(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr))== -1) { perror("РћС?РёР±РєР° вызова bind()"); exit(1); } fprintf(stderr, "Сервер готов: %s\n", inet_ntoa(serv_addr.sin_addr)); if(listen(s, 5) == -1) { perror("РћС?РёР±РєР° вызова listen()"); exit(1); } while(1) { int addrlen; bzero(&clnt_addr, sizeof(clnt_addr)); addrlen = sizeof(clnt_addr); if((ns = accept(s, (struct sockaddr *)&clnt_addr, &addrlen))== -1) { perror("РћС?РёР±РєР° вызова accept()"); exit(1); } fprintf(stderr, "Клиент = %s\n", inet_ntoa(clnt_addr.sin_addr)); if((pid = fork())==-1) { perror("РћС?РёР±РєР° вызова fork()"); exit(1); } if(pid==0) { int nbytes; int fout; close(s); while((nbytes = recv(ns, buf, sizeof(buf), 0)) != 0) { send(ns, buf, sizeof(buf), 0); } close(ns); exit(0); } } }

Клиент:

Код:

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <fcntl.h> #include <netdb.h> #define PORTNUM 1500 main(argc, argv) char *argv[]; int argc; { int s; int pid; int i, j; struct sockaddr_in serv_addr; struct hostent *hp; char buf[80]="Hello, World!"; if((hp=gethostbyname(argv[1])) == 0) { perror("РћС?РёР±РєР° вызова gethostbyname()"); exit(3); } bzero(&serv_addr, sizeof(serv_addr)); bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length); serv_addr.sin_family = hp->h_addrtype; serv_addr.sin_port = htons(PORTNUM); if((s=socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("РћС?РёР±РєР° вызова socket()"); exit(1); } fprintf(stderr, "Адрес клиента: %s\n", inet_ntoa(serv_addr.sin_addr)); if(connect(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) { perror("РћС?РёР±РєР° вызова connect()"); exit(1); } send(s, buf, sizeof(buf), 0); if(recv(s, buf, sizeof(buf), 0) < 0) { perror("РћС?РёР±РєР° вызова recv()"); exit(1); } printf("Получено РѕС‚ сервера: %s\n", buf); close(s); printf("Клиент заверС?РёР» работу \n\n"); }

Где иероглифы - это просто сообщения на русском языке.
Знаешь, мне уже не важно!
Все не так уж важно....
Спасибо сказали:
Аватара пользователя
Atragor
Сообщения: 681
Статус: ...

Re: Взаимодействие программ клиента и сервера

Сообщение Atragor »

Запускаете сначала сервер

Код: Выделить всё

./server
Сервер готов: 0.0.0.0

потом клиент с параметром 127.0.0.1

Код: Выделить всё

./client 127.0.0.1
Адрес клиента: 127.0.0.1
Получено от сервера: Hello, World!
Клиент завершил работу

При этом сервер выводит

Код: Выделить всё

Клиент = 127.0.0.1

Вот в общем-то и всё.
If you were MEANT to understand it, we wouldn't have called it 'code' © bash.org
Спасибо сказали:
Аватара пользователя
MumiyTroll2008
Сообщения: 28
ОС: WinXP + куча *nix-ов

Re: Взаимодействие программ клиента и сервера

Сообщение MumiyTroll2008 »

Да спасибо получилось у меня, но как то странно.
Когда запускаю сервер через терминал - сервер запускается но не ввести в терминале ни одну команду (в том числе клиента) после запуска сервера

В общем вышел из положения так:
Сервер запускаю прямом мышкокликанием из папки где находится программа-сервер, а затем в терминале запускаю клиента все работает как положено :rolleyes: .
И почему интересно из терминала неполучается запустить обе программы?

И еще, а что это за такой код Да-Винчи ну параматр передаваемый клиенту 127.0.0.1 ?
Знаешь, мне уже не важно!
Все не так уж важно....
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Взаимодействие программ клиента и сервера

Сообщение Ardes »

локальный адрес вашей машины
Спасибо сказали:
Аватара пользователя
UTeHok
Сообщения: 354
Статус: Антиглобалист
ОС: Debian GNU/Linux

Re: Взаимодействие программ клиента и сервера

Сообщение UTeHok »

MumiyTroll2008 писал(а):
30.07.2008 20:28
Да спасибо получилось у меня, но как то странно.
Когда запускаю сервер через терминал - сервер запускается но не ввести в терминале ни одну команду (в том числе клиента) после запуска сервера

В общем вышел из положения так:
Сервер запускаю прямом мышкокликанием из папки где находится программа-сервер, а затем в терминале запускаю клиента все работает как положено :rolleyes: .
И почему интересно из терминала неполучается запустить обе программы?


Код: Выделить всё

$./server > /dev/null &
$./client
«Make love, not war!»
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Взаимодействие программ клиента и сервера

Сообщение Luinnar »

MumiyTroll2008 писал(а):
30.07.2008 20:28
Да спасибо получилось у меня, но как то странно.
Когда запускаю сервер через терминал - сервер запускается но не ввести в терминале ни одну команду (в том числе клиента) после запуска сервера

Просто программа-сервер не завершает работу, а ждёт соединений. Как уже написали, можно запустить её в бэкграунде:

Код: Выделить всё

./server &

Ну а я бы предпочёл запустить server просто в другой консоли. Так, чтобы можно было видеть вывод обеих программ и чётко понимать какая программа что вывела.
Спасибо сказали: