LINUX.ORG.RU

2 потока по ethernet одновременно


0

1

Доброго времени суток. Разрабатываю По. Утравлениее устройством осуществляется по Ethernet.Подключение к порту и IP осущ. след образом:

void sends(char message[20], int len_msg)

   char buf[sizeof(message)];
   struct sockaddr_in addr;
 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)   &#123;        perror("socket");    &#125;
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000); // или любой другой порт...
    addr.sin_addr.s_addr = htonl(((in_addr_t) 0xc0a80164));
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) <0)            perror("connect");   
 
    send(sock, message, len_msg, 0);
    recv(sock, buf, sizeof(message), 0); 

Появилась задача параллельно отправлять данные на другой IP и порт. Пробовал написать вторую функцию с другим портом и IP. Но ничего не получилось.

Подскажите каким способом можно создать второе подключение, при этом не нарушив работу первого??

>Но ничего не получилось.
Хотелось бы подробностей, что конкретно не получилось: не открывается сокет, не идут данные, ...

trex6 ★★★★★ ()

>void sends(char message[20], int len_msg)

sock = socket(AF_INET, SOCK_STREAM, 0);

это что, на отправку каждого сообщения сокет новый открывать? :)

Появилась задача параллельно отправлять данные на другой IP и порт.

Создай два неблокирующих сокета

yoghurt ★★★★★ ()
Ответ на: комментарий от trex6

Вторая функция должна раз в 2 сек. отправлять на заданный IP и порт небольшой пакет. Она это и делает, но при этом разрывается первое соединение. У меня не получается переподключать первое соединение. Может есть способ заставить их работать одновременно?

daenur ()
Ответ на: комментарий от encyrtid

Весь код в студию.

Это весь код.

 
void sends(char message[20], int len_msg)
{
   char buf[sizeof(message)];
   struct sockaddr_in addr;
 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)   {        perror("socket");    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000); // или любой другой порт...
    addr.sin_addr.s_addr = htonl(((in_addr_t) 0xc0a80164));
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)    {        perror("connect");   }
 
    send(sock, message, len_msg, 0);
    recv(sock, buf, sizeof(message), 0);   
}
 

отправку пакетов произвожу функцией send

daenur ()
Ответ на: комментарий от daenur

У меня во многих программах 2 и больше соединений работает одновременно.
Проблема не в сокетах, а в том, как Вы их используете. Хотелось бы увидеть код ваших функций (обеих) и пример их использования.

trex6 ★★★★★ ()

столько готовых способов IPC сделать а ты фигнёй страдаешь. Используй какой-нить zeroMQ. ну и, конечно, надо проверять что send и recv возвращают.

true_admin ★★★★★ ()
Ответ на: комментарий от daenur

а почему бы не создать два параллельных потока(ну хотябы через приметивный fork) а потом в каждом установить два различных соединения и работать?

energyclab ()
Ответ на: комментарий от daenur

Это весь код.

   struct sockaddr_in addr;
 
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)   {        perror("socket");    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000); // или любой другой порт...
    addr.sin_addr.s_addr = htonl(((in_addr_t) 0xc0a80164));
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)    {        perror("connect");   }

ты создаешь каждый раз по сокету и их не закрываешь. нафига так делать? сделай где-то выше при старте один сокет и пиши в него. где-то ниже, при подыхании, закрывай его. потом, протестив работоспособность, рядом с первым сделай второй sock2, если угодно, тогда твоя фунциклюшка отправки будет выглядеть примерно так:

void sends(char message[20], int len_msg)
{
   char buf[sizeof(message)];
 
   send(sock, message, len_msg, 0);
   recv(sock, buf, sizeof(message), 0);   

   send(sock2, message, len_msg, 0);
   recv(sock2, buf, sizeof(message), 0);   
}

не?

Rastafarra ★★★★ ()
Ответ на: комментарий от daenur

> Вторая функция должна раз в 2 сек. отправлять на заданный IP и порт небольшой пакет

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

Rastafarra ★★★★ ()
Ответ на: комментарий от daenur

если я все правильно понял необходимо следующее:

int connectTCP( char *addr, int port ) {
//создать сокет
//сделать connect
//вернуть созданный сокет - return sockTcp;
}

int main() {
int sockThread_1 = connectTCP( /* гнездо для первого соединения */ );
int sockThread_2 = connectTCP( /* гнездо для второго соединения */ );

//делим на два потока, или клонируем себя (в общем смотря чем пользоваться)
int pid = fork();
if( pid < 0 ) {
printf( «Ошибка вызова fork» );
return -1;
}
if( pid == 0 ) {
printf( «Мы в ребенке» );
/* отправляем через каждые две секунды пакеты используя sockThread_1
что то типа этого */
while( 1 ) {
// Проверка условия на выход из цикла
....
// Отсылка с задержкой
send( ... );
delay( 2000 );
}
}
else {
printf( «Мы в родителе» );
// работаем по sockThread_2
// твои действия ....
//send(sock, message, len_msg, 0);
//recv(sock, buf, sizeof(message), 0);
}

close( sockThread_1 );
close( sockThread_2 );
return 0;
}




Ну вот что то в роде этого ( если я конечно правильно понял проблему, хотя конечно этот способ лучше для UDP соединений )

energyclab ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.