Это архив сайта coldflame.by.ru, он не обновлялся с 2007 года. Мой современный сайт тут: http://leonid.shevtsov.me.
Домой! Обо мне Специально для РИ-06-1 Разнообразное... барахло, короче :) Программы и прочее Статьи и переводы Блог SmartDaemon
Предыдущая ОглавлениеСледующая

1. Введение

Эй! Не можешь осилить программирование сокетов? Сложновато разобраться в справочниках и руководствах? Хочешь заняться программированием для Интернета, но не хватает времени на то, чтобы перерывать всю справку, чтобы понять, что сначала нужно вызвать bind(), а потом connect(), и т.д. и т.п.

Что же! Представляешь, я уже прошел через все эти проблемы (а я за ним последовал :) - прим. перев.) и горю желанием поделиться своими знаниями со всеми! Ты попал туда, куда нужно. Этот документ должен дать программисту на C/C++ средней продвинутости все, что нужно для успешного сетевого программирования.


1.1. Аудитория

Этот документ написан как руководство, а не справочник. Наверное, лучше всего он подойдет индивидуумам, которые только начинают разбираться с сокетами и ищут точку опоры. Разумеется, это не полное руководство по программированию сокетов - в любом смысле этого слова.

Надеюсь, тем не менее, этого как раз хватит для того, чтобы справка перестала казаться полной белибердой... :-)


1.2. Платформа и компилятор

Код в этом руководстве был скомпилирован под Linux, используя Gnuшный компилятор gcc. Соответственно, он должен компилиться практически на любой платформе, где используется gcc. Однако, это не каcается Windows - см. раздел для программистов под Windows, ниже.


1.3. Официальный сайт

Официальное размещение этого руководства http://beej.us/guide/bgnet/.


1.4. Замечание для программистов под Solaris/SunOS

При компиляции под Solaris и SunOS нужно указать пару дополнительных параметров для подключения библиотек. Просто добавь "-lnsl -lsocket -lresolv" в конец вызова компилятора, примерно так:

$ cc -o server server.c -lnsl -lsocket -lresolv

Если ошибки не прекратились, попробуй добавить "-lxnet" в конец этой командной строки Не знаю наверняка, что это делает, но некоторым людям это понадобидось.

Ты можешь также обнаружить ошибки в вызове setsockopt(). Он отличается от Linux'ового варианта, так что вместо:

int yes=1;

пиши:

char yes='1';

Поскольку у меня нет Sun, я не проверял вышеуказанное - эти советы присылались мне по электронной почте.


1.5. Замечание для программистов под Windows

Лично я не люблю Windows, и советую тебе попробовать вместо нее Linux, BSD, or Unix. (:-) - прим. перев.) Тем не менее, ты можешь прекрасно использовать это руководство под маздаем.

Для начала, забудь все, что я писал (и напишу) про файлы заголовков. Все, что тебе надо подключать, это:

#include <winsock.h>

Подожди! Тебе также надо вызвать WSAStartup() перед работой с сокетами. Код этого вызова выглядит примерно так:

#include <winsock.h>

{
    WSADATA wsaData;   // если это не сработает
    //WSAData wsaData; // попробуй вот так

    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        fprintf(stderr, "Ошибка WSAStartup.\n");
        exit(1);
    }

Еще нужно подключить библиотеку Winsock, которая обычно называется wsock32.lib или winsock32.lib или что-то вроде этого. Под VC++, открой меню Project->Settings. Открой закладку Link и ищи поле "Object/library modules". Добавь туда "wsock32.lib".

По крайней мере, так мне рассказали.

Наконец, ты должен вызвать WSACleanup() перед завершением работы. Посмотри в справке, как жто делается

После всего этого, все примеры буду работать, за несколькими исключениями. Во-первых, ты не можешь закрывать сокеты функцией close() - вместо нее нужно использовать closesocket(). select() также работает только с дескрипторами сокетов (а не файлов, например, 0 для stdin).

Помимо этого, есть класс CSocket. Опять-таки подсмотри его в справке.

За дополнительной информацией о Winsock иди в Winsock FAQ.

В Windows нет функции fork(), которая, к сожалению, используется в нескольких примерах. Возможно, для ее использования нужно подключить библиотеку POSIX или еще что-нибудь, или использовать CreateProcess(). Однако, fork() не требует ни одного аргумента, а CreateProcess() требует немеряное количество. Если это слишком сложно для тебя, CreateThread() выглядит попроще... Увы, дискуссия о многопоточности выходит за рамки этого руководства. Нельзя объять необъятное!


1.6. Электронная почта

Я готов ответить на вопросы по электронной почте, так что можешь мне писать, но я не гарантирую, что отвечу. Я довольно-таки занятой человек и иногда просто не могу ответить на твой вопрос. Если это так, я просто удаляю сообщение. Ничего личного, просто у меня никогда не будет времени на написание подробного ответа.

Как правило, чем сложнее вопрос, тем менее вероятно, что я на него отвечу. Если ты можешь уточнить его и указать всю необходимую информацию (платформу, компилятор, сообщения об ошибках и все, что посчитаешь нужным), то скорее получишь ответ. Прочитай также документ ESR'а, How To Ask Questions The Smart Way.

Если ты не получил ответа, подумай еще немного, попытайся найти его сам, и если так и не найдешь, напиши мне еще раз, дополни вопрос новыми данными и, возможно, этого будет достаточно, чтобы я смог тебе помочь.

Теперь, когда я рассказал тебе, как мне писать и как мне не писать, я хотел бы поблагодарить всех за похвалы, которые это руководство получало. Это огромная моральная поддержка, и я рад, что оно использовалось по назначению! :-) Спасибо!


1.7. Зеркалирование

Я буду только рад, если ты сделаешь зеркало этого сайта, общественное или личное. Если ты сделаешь публичное зеркало и хочешь, чтобы я поместил ссылку на него на главной странице, просто напиши мне на [email protected].


1.8. Замечания для переводчиков

Если ты хочешь перевести это руководство на другой язык, напиши мне на [email protected] и я размещу ссылку на перевод на главной странице.

Разумеется, можешь добавить к переводу свое имя и адрес.

К сожалению, мне не хватает места, чтобы размещать все переводы у себя.


1.9. Авторские права и распространение

Beej's Guide to Network Programming is Copyright © 2005 Brian "Beej" Hall.

This guide may be freely reprinted in any medium provided that its content is not altered, it is presented in its entirety, and this copyright notice remains intact.

Educators are especially encouraged to recommend or supply copies of this guide to their students.

This guide may be freely translated into any language, provided the translation is accurate, and the guide is reprinted in its entirety. The translation may also include the name and contact information for the translator.

The C source code presented in this document is hereby granted to the public domain.

Contact [email protected] for more information.


Предыдущая ОглавлениеСледующая