Показать сообщение отдельно

клиент
  #2  
Старый 22.02.2008, 16:01
zythar
Moderator - Level 7
Регистрация: 16.02.2008
Сообщений: 580
Провел на форуме:
1595333

Репутация: 291


Отправить сообщение для zythar с помощью ICQ
Thumbs up клиент

клиент
теперь напишем консольную версию нашего клиента к нашему серваку.
итак. определим что будет делать наш клиент.
на стороне клиента все организовать очень очень легко. нужно сделать вот что.
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);
пусть это будет вашим домашним заданием ((*

Последний раз редактировалось zythar; 24.02.2008 в 08:46..