клиент
теперь напишем консольную версию нашего клиента к нашему серваку.
итак. определим что будет делать наш клиент.
на стороне клиента все организовать очень очень легко. нужно сделать вот что.
1. задать параметры подключения
2. подключится к серверу
3. получить сообщение
4. закрыть соединение с сервером
как задать параметры подключения?
помните когда мы объявляли структуру типа sockaddr_in для сервера? там
мы задавали параметры сервера. тобишь на каком айпишнике он будет, на
каком порте будет работать... для клиента мы тоже должны объявить
структуру. и там будут параметры подключения. на какой порт
подключаться (поле sin_port), ip адрес сервера (поле sin_addr.s_addr),
а поле sin_family остается тоже (AF_INET). думаю нет надобности
объяснять почему.
как подключится к серверу?
функция connect(2).
Код:
int connect(int s, const struct sockaddr *name, socklen_t namelen);
что за аргументы функции объяснять не буду ибо объяснил в статье посвященной серверу.
как получить сообщения?
функции read(2) и write(2). их я также описал в предыдущей статье.
как закрыть соединение с сервером?
a
функция close(2). см. статью "сервер"
<---------------------cut here------------------------>
ну вот собственно и все. клиента мы описали. ниже приведу листинг клиента.
Код:
#include <stdio.h> //printf() #include <unistd.h> //read(); write(); close() #include <sys/types.h> //хз просто нужно #include <sys/socket.h> //socket() и другое #include <netinet/in.h> //sockaddr_in #include <string.h> //strlen()
int main(int argc, char *argv[]) { int s; int bytes; struct sockaddr_in ca; char buffer[32];
bzero(&buffer, 32); //обнуляем массив
s=socket(AF_INET, SOCK_STREAM, 0);
ca.sin_family=AF_INET; ca.sin_port=htons(666); //порт на котором сервак ca.sin_addr.s_addr=inet_addr("127.0.0.1"); //если дадим просто 127.0.0.1 то он не подключится к данному айпишнику. айпишник нуно переделать в сетевой формат
connect(s, (struct sockaddr *)&ca, sizeof ca); bytes=read(s, buffer, 32); close(s);
/*вывод можно организовать двумя способами: либо при помощи printf: printf("%s\n", buffer), либо функцией write: write(1, buffer, strlen(buffer)). я предпочитаю выводить строки write-ом*/ write(1, buffer, strlen(buffer));
return 0; }
p.s. при подключении к серверу можно написать так чтобы он подключался
к доменному имени. тобишь в поле sin_addr.s_addr написать не
194.67.57.26 а mail.ru к примеру. для этого нужно заранее объявить
указатель на структуру типа struct hostent *he;
потом юзать функцию gethostbyname(3). а потом скопировать содержимое
поля h_addr_list[0] структуры he в поле sin_addr структуры типа
sockaddr_in. вот листинг этого участка кода:
Код:
struct hostent *he; sa.sin_family=AF_INET; sa.sin_port=htons(666); he=gethostbyname("mail.ru"); bcopy(he->h_addr_list[0], &sa->sin_addr, he->h_length);
пусть это будет вашим домашним заданием ((*
|