The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"SLIP и PPP сокеты в программах на C . "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Языки программирования)
Изначальное сообщение [ Отслеживать ]

"SLIP и PPP сокеты в программах на C . "  +/
Сообщение от Ruslan email(??) on 09-Сен-12, 05:13 
Всем доброго времени суток .
Подскажите пожалуйста , каким образом можно создать сокет работающий по протоколу SLIP или PPP .
Все действия должны производиться над настроенным файловым дескриптором типа /dev/ttySn .
Может юзать AF_UNIX ?
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от Andrey Mitrofanov on 09-Сен-12, 08:31 
> Подскажите пожалуйста , каким образом можно создать сокет работающий по протоколу SLIP или PPP .

Выбирай:
1/ Никак. Сокеты не "работают по протоколу", это эээ... байтовые трубы.
2/ Запусти на том конце slirp (ключи -- в ман слирп внизапно).

> над настроенным файловым дескриптором типа /dev/ttySn . Может юзать AF_UNIX ?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от RUSLAN_S email(ok) on 12-Сен-12, 23:33 
>> Подскажите пожалуйста , каким образом можно создать сокет работающий по протоколу SLIP или PPP .
> Выбирай:
> 1/ Никак. Сокеты не "работают по протоколу", это эээ... байтовые трубы.
> 2/ Запусти на том конце slirp (ключи -- в ман слирп внизапно).
>> над настроенным файловым дескриптором типа /dev/ttySn . Может юзать AF_UNIX ?

Всем спасибо , всё решилось как всегда очень просто - простой утилиткой под названием SLATTACH . Которая позволяет навязать IP на последовательную линию .
Сокеты - это байтовые трубы ??? Может вы с PIPE-ами путаете ???

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от pavlinux (ok) on 10-Сен-12, 02:19 
> Подскажите пожалуйста , каким образом можно создать сокет работающий по протоколу SLIP или PPP .

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от RUSLAN_S email(ok) on 12-Сен-12, 23:53 
> Всем доброго времени суток .
> Подскажите пожалуйста , каким образом можно создать сокет работающий по протоколу SLIP
> или PPP .
> Все действия должны производиться над настроенным файловым дескриптором типа /dev/ttySn
> .
> Может юзать AF_UNIX ?

SLIP - инкапсуляция IP на последовательной линии - самый старый способ передачи IP в последовательную линию .
Сначала создаём новый сетевой интерфейс поверх последовательной линии :

slattach -s 4800 -p slip /dev/ttyS0

Теперь оба терминала заблокированы на операциях , а через нуль-модемный кабель установлено сетевое соединение .
Присваиваем ему сетевой адрес :

ifconfig sl0 192.168.5.1

#etc/network/interfaces

sl0 Link encap:Serial Line IP
    inet addr:192.168.5.1  P-t-P:192.168.5.1   Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST   MTU:296  Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:10
    RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от pavlinux (ok) on 13-Сен-12, 02:08 
> самый старый способ передачи IP в последовательную линию.

Мог бы просто задать вопрос - "Как соединить два компа через СОМ-порт"

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от RUSLAN_S email(ok) on 14-Сен-12, 07:59 
> Мог бы просто задать вопрос - "Как соединить два компа через СОМ-порт"

Как соединить 2 компа через COM-порт мне известно :) .
Дело в том , что мне не нравится интерфейс termios .
Легче навязать на порт IP , открыть сокет в своём приложении и уже туда sendit-ь всё .

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от pavlinux (ok) on 15-Сен-12, 04:16 
> Дело в том , что мне не нравится интерфейс termios .

А кто те сказал, что мы тебе посоветуем termios, делать нам нефига?!
Я б вот pppd посоветовал, он разрывы и потери лучше обрабатывает и
восстанавливает http://tldp.org/HOWTO/PPP-HOWTO/direct.html
Хотя, если между компами два метра - пофигу.


Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от RUSLAN_S (ok) on 15-Окт-12, 03:04 
Вопрос ведь звучал "SLIP и PPP сокеты В ПРОГРАММАХ НА C" ,
вот и решил - надо дописать , раз уж взялся .
Вешаю 2 slip-интерфейса на 2 USB-RS232-переходника ,
настраиваю ip на "192.168.5.1" и "192.168.5.2" .
Пингую - пинг есть до обоих .
===============================
slattach -dv -p slip -s 9600 /dev/ttyUSB0 &
slattach -dv -p slip -s 9600 /dev/ttyUSB1 &
ifconfig sl0 192.168.5.1
ifconfig sl1 192.168.5.2
===============================
Дальше код на C :
===============================
#define _BSD_SOURCE || _SVID_SOURCE //feature test macro requirement for glibc for inet_aton() .

#include <sys/poll.h> //poll ...
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> //inet_aton ...
#include <stdio.h>    //perror
#include <stdlib.h> //exit ...

#define RECEIVE_FLAGS 0
#define SEND_FLAGS 0
#define HOST_ADDRESS "192.168.5.1"
#define RCVR_ADDRESS "192.168.5.2"

char message[] = "F_Message";
char buffer[1024];

int snd_error(int exit_code,char *msg)
{
    perror(msg);
    exit(exit_code);
};

void *recvall(int rcvr, struct sockaddr_in *addr, void *buf, int len) //receiving all the data array , a parts.
{
    int rcvd = 0;
    void *bufcpy = buf;
    socklen_t addrlen = (socklen_t)sizeof(*addr);
    while(len)
    {
        rcvd = recvfrom(rcvr,buf,len,RECEIVE_FLAGS,(struct sockaddr *)addr,&addrlen);
        if(-1 == rcvd)
            snd_error(4,"in funktion recvall , recvfrom : ");
        len -= rcvd;
        buf += rcvd;
    }
    return bufcpy;
};

void sendall(int sndr, struct sockaddr_in *addr, void *msg, int len) //sending all the data array , a parts
{
    int sendd = 0;
    socklen_t addrlen = (socklen_t)sizeof(*addr);
    while(len)
    {
        sendd = sendto(sndr,msg,len,SEND_FLAGS,(struct sockaddr *)addr,addrlen);
        if(-1 == sendd)
            snd_error(5,"in funktion sendall , sendto : ");
        len -= sendd;
        msg += sendd;
    }
};

int main(int argc , char *argv[])
{

    int HOST_SOCK,RCVR_SOCK; //in upper case for highlihting .
    struct sockaddr_in host_addr;
    struct sockaddr_in rcvr_addr;

    HOST_SOCK = socket(AF_INET,SOCK_DGRAM,0);
    if(HOST_SOCK<0)
        snd_error(1,"in funktion main , socket : ");

    RCVR_SOCK = socket(AF_INET,SOCK_DGRAM,0);
    if(RCVR_SOCK<0)
        snd_error(2,"in funktion main , socket : ");

    host_addr.sin_family = AF_INET;
    host_addr.sin_port = htons(3000);
    if(0 == inet_aton(HOST_ADDRESS,&(host_addr.sin_addr)))
        snd_error(2,"in funktion main , inet_aton : ");

    if(-1 == bind(HOST_SOCK,(struct sockaddr *)&host_addr,sizeof(host_addr)))
        snd_error(3,"in funktion main , bind : ");

    rcvr_addr.sin_family = AF_INET;
    rcvr_addr.sin_port = htons(3000);
    if(0 == inet_aton(RCVR_ADDRESS,&(rcvr_addr.sin_addr)))
        snd_error(6,"6 in funktion main , inet_aton : ");

    if(-1 == bind(RCVR_SOCK,(struct sockaddr *)&rcvr_addr,sizeof(rcvr_addr)))
        snd_error(4,"in funktion main , bind : ");

    sendall(HOST_SOCK,&rcvr_addr,message,sizeof(message));
    recvall(RCVR_SOCK,&host_addr,buffer,sizeof(message));
    printf("%s\n",buffer);

    return 0;
};
===============================
$./a.out
F_Message
===============================
При извлечении любого из переходников программа выдаёт ошибки при вызове bind и данные не проходят . Что свидетельствует о передаче пакетов именно по проводу :)

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

8. "SLIP и PPP сокеты в программах на C . "  +/
Сообщение от RUSLAN_S email(ok) on 01-Окт-12, 03:08 
Вчера попинговал свой USB-RS232 переходничок :
================================
slattach -dm -p slip -s 9600 /dev/ttyUSB0 &
================================
slattach: tty_open: looking for lock
slattach: tty_open: trying to open /dev/ttyUSB0
slattach: tty_open: /dev/ttyUSB0 (fd=3) slip started on /dev/ttyUSB0 interface sl0
slattach: tty_set_speed: 0
================================
ifconfig sl0 192.168.5.1
ifconfig sl0
================================
sl0       Link encap:Serial Line IP  
          inet addr:192.168.5.1  P-t-P:192.168.5.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:296  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
================================
ping 192.168.5.1
================================
PING 192.168.5.1 (192.168.5.1) 56(84) bytes of data.
64 bytes from 192.168.5.1: icmp_req=1 ttl=64 time=0.034 ms
64 bytes from 192.168.5.1: icmp_req=2 ttl=64 time=0.033 ms
64 bytes from 192.168.5.1: icmp_req=3 ttl=64 time=0.039 ms
64 bytes from 192.168.5.1: icmp_req=4 ttl=64 time=0.035 ms

--- 192.168.5.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.033/0.035/0.039/0.004 ms

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру