Как сокеты работают в C?

попробуйте это ....

 protected void Page_Load(object sender, EventArgs e)
{
    using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand("select * from Table1", conn);
        conn.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        GridView1.DataSource = dr;
        GridView1.DataBind();
        conn.Close();
    }

}

<div>
    <asp:GridView ID="GridView1" runat="server"></asp:GridView>
</div>
21
задан Enamul Hassan 8 August 2015 в 17:26
поделиться

4 ответа

Короткий ответ - то, что необходимо сделать весь тяжелый подъем себя. Вы можете быть уведомлены, что существуют доступные данные, которые будут считаны, но Вы не будете знать, сколько байтов доступно. В большинстве протоколов IP, которые используют пакеты переменной длины, будет заголовок с известной фиксированной длиной, предварительно ожидаемой к пакету. Этот заголовок будет содержать длину пакета. Вы читаете заголовок, получаете длину пакета, затем читаете пакет. Вы повторяете этот шаблон (заголовок чтения, затем считайте пакет), пока коммуникация не завершена.

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

Вот типичная функция C для чтения числа набора байтов от сокета:

/* buffer points to memory block that is bigger than the number of bytes to be read */
/* socket is open socket that is connected to a sender */
/* bytesToRead is the number of bytes expected from the sender */
/* bytesRead is a pointer to a integer variable that will hold the number of bytes */
/*           actually received from the sender. */
/* The function returns either the number of bytes read, */
/*                             0 if the socket was closed by the sender, and */
/*                            -1 if an error occurred while reading from the socket */
int readBytes(int socket, char *buffer, int bytesToRead, int *bytesRead)
{
    *bytesRead = 0;
    while(*bytesRead < bytesToRead)
    {
        int ret = read(socket, buffer + *bytesRead, bytesToRead - *bytesRead);
        if(ret <= 0)
        {
           /* either connection was closed or an error occurred */
           return ret;
        }
        else
        {
           *bytesRead += ret;
        }
    }
    return *bytesRead;
}
17
ответ дан 29 November 2019 в 21:06
поделиться

Так, ответ на Ваш вопрос зависит немного от того, используете ли Вы UDP или TCP как Ваш транспорт.

Для UDP, жизнь становится намного более простой, в котором можно назвать recv/recvfrom/recvmsg с размером пакета, в котором Вы нуждаетесь (Вы, вероятно, отправили бы пакеты фиксированной длины от источника так или иначе), и сделайте предположение, что, если данные доступны, это находится там в кратных числах размеров длины пакета. (Т.Е. Вы называете recv* с размером Вашего пакета стороны отправки, и Вы установлены.)

Для TCP, жизнь становится немного более интересной - в целях этого объяснения, я предположу, что Вы уже знаете, как использовать сокет (), связать (), слушаете () и принимаете () - последнее существо, как Вы получаете дескриптор файла (FD) своей недавно установленной связи.

существует два способа сделать ввод-вывод для сокета - блокирование, в котором Вы называете чтение (fd, buf, N), и чтение находится там и ожидает, пока Вы не считали байты N в buf - или неблокирование, в которое необходимо проверить (использующий выбор () или опрос ()), читаем ли FD, и ЗАТЕМ сделайте чтение ().

При контакте с основанными на TCP соединениями, ОС не обращает внимание на размеры пакета, так как это рассмотрело непрерывный поток данных, не отдельные блоки размера пакета.

, Если Ваше приложение использует "пакеты" (упакованные или распакованные структуры данных, которые Вы раздаете), необходимо быть в состоянии назвать чтение () с надлежащим аргументом размера и считать всю структуру данных от сокета за один раз. Единственный протест, с которым необходимо иметь дело, должен помнить к правильно порядку байтов любые данные, которые Вы отправляете, в случае, если источник и целевая система имеют другой порядок байтов байта. Это относится и к UDP и к TCP.

До *ОТКЛОНЯЮТ программирование сокета, затронут, я настоятельно рекомендую W. "Сетевое программирование Unix Richard Stevens, Издание 1" (UNPv1) и "Усовершенствованное Программирование в Среде Unix" (APUE). Первым является том относительно основанного на сети программирования, независимо от транспорта, и последний является хорошей всесторонней книгой программирования, поскольку это относится *, ОТКЛОНЯЮТ базирующееся программирование. Кроме того, ищите "TCP/IP, Проиллюстрированный", Объемы 1 и 2.

13
ответ дан 29 November 2019 в 21:06
поделиться

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

3
ответ дан 29 November 2019 в 21:06
поделиться

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

1
ответ дан 29 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: