Из книги Робачевского успешно переписал исходники. Скомпилировались благополучно и клиент и сервер.
В книге написано:"клиент отправляет серверу сообщение, сервер передает его обратно, а клиент, в свою очередь, выводит полученное сообщение на экран"
Запускаю сервер. Затем клиент, передав ему свой адрес 127.0.0.1
И ничего не происходит. почему не выводится hello world?
Привожу текст сервера
#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>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PORTNUM 1500
int nport;
struct hostent *hp;
int main(argc, argv)
int argc;
char *argv[];
{
int s, ns;
int pid;
char buf[80], hname[80];
/*Преобразуем порядок следования байтов к сетевому формату*/
nport = PORTNUM;
nport = htons((u_short)nport);
/*Создадим сокет использующий протокол TCP*/
if ((s=socket(AF_INET, SOCK_STREAM, 0))==-1)
{
perror("Ошибка вызова socket()");
exit(1);
}
//Зададим адрес коммуникационного узла
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
memset(&serv_addr,0, 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;
memset(&clnt_addr,0,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);
}
close(ns);
}
return 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>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PORTNUM 1500
int main(argc, argv)
int argc;
char *argv[];
{
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");
}