Четверг
26.12.2024
18:00
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта

Категории каталога
Web [2]
Статьи по Web-программированию.
Системное и прикладное [4459]

Начало » Статьи » Программирование » Системное и прикладное

[для новичков]сетевое программирование на си под unix: часть 2. клиент
клиент
теперь напишем консольную версию нашего клиента к нашему серваку.
итак. определим что будет делать наш клиент.
на стороне клиента все организовать очень очень легко. нужно сделать вот что.
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 (25.03.2008)
Просмотров: 1874 | Комментарии: 2 | Рейтинг: 5.0 |

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Вход

Поиск по каталогу



Кто сейчас на сайте:
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Друзья сайта

Статистика


Copyright KulX © 2007
ВНИМАНИЕ:Администрация не несет ответственности за публикуемые авторами материалы!
Хостинг от uCoz