Могу ли я отправить в Socket и получить от него в том же месте в C - PullRequest
2 голосов
/ 13 октября 2010

У меня есть DLL, написанная на C. Я хотел бы отправить данные в сокет и получить ответ в той же функции.
Например:

BOOL SendToSocketAndRecv(...)  
{  
   // ...
   send(...);  
   retval = recv(...);  
   // ...
}  

Другими словами, моя DLL должнане следовать паттерну Client Server.

Возможно ли это?
любая помощь?
Спасибо - Хайралла

Ответы [ 4 ]

1 голос
/ 13 октября 2010
  1. Да
  2. Вы можете работать в блокирующем (синхронном) или неблокирующем (асинхронном) режиме. В зависимости от этого вы можете отправлять или не отправлять больше данных, прежде чем что-то получать от партнера.
  3. Сокеты «Stream» (например, TCP) являются «туннелями». Если одноранговый узел отправляет несколько пакетов, вы можете получить их за один вызов на recv, и наоборот - единое «сообщение» от однорангового узла может принять несколько вызовов на recv. Следовательно, вы должны прочитать сообщение в цикле.
  4. Вам нужно многое узнать о сетевом программировании.
0 голосов
/ 13 октября 2010

Я отправляю команды роботу и жду ответа

Да, что у вас будет работать.

Но вещи начинают становиться интересными, если учесть вероятность того, что робот не ответит по какой-либо причине. Затем вам нужно указать время ожидания ответа. Вскоре начинают появляться другие вещи. Например, вы можете не захотеть застрять в чтении на время ожидания, поскольку вам может потребоваться обслуживать другие события (пользовательский ввод или другие источники) по мере их поступления.

Обычная архитектура для этого - использовать select () и сделать его центром всех ваших входящих событий. Затем вы запускаете конечный автомат (или машины) из этих событий. В итоге вы получаете управляемую событиями архитектуру. Это будет выглядеть примерно так:

while(true)
{
    select(fds for event sources, timeout);

    if (timeout)
    {
        call robot state machine(timeout);
        continue;
    }

    iterate through fds
    {
        if (fd has data)
        {
            read data into buf

            if (fd is for robot)
            {
                call robot state machine(buf)
            }
            else if (fd is for source1)
            {
                call source1 state machine(buf)
            }
            ...
        }
    }
}

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

0 голосов
/ 13 октября 2010

это не только возможно, это классическая идиома кодирования для клиента в системе клиент-сервер.Обычно функция называется что-то вроде ExecuteRequest

0 голосов
/ 13 октября 2010

Да, это возможно и законно. Сам API не заботится об использовании из одной и той же функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...