LINUX.ORG.RU

[странное] про сокеты

 


0

0

Привет.

Вот такой код работает нормально и даже виден в netstat:

HOST = '127.0.0.1'
PORT = 40018
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.connect((HOST, PORT))
Кто-нить знает почему получается приконнектится к сокету на который не сделан listen?

PS по мотивам www.linux.org.ru/view-message.jsp?msgid=3392056

★★★★★

Почему бы этому коду не быть видным в netstat, если у тебя есть s.bind() ? Поясни, насчет "сокета на который не сделан listen"

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

2klalafuda, tailgunner: я думал вы питонщики :).

> Почему бы этому коду не быть видным в netstat, если у тебя есть s.bind() ? Поясни, насчет "сокета на который не сделан listen"


Мне казалось что чтобы сокет был доступен для коннект надо сделать listen и accept. А тут этого не делается.

В netstat будет вот такое для кода который приведу ниже:
tcp6 0 0 ::1:3490 ::1:3490 ESTABLISHED 12473/a.out


Это запущено на линуксе.
Код программы которая делает такое вот сдесь: http://dpaste.com/107044/
Я тока добавил строчки 79-82 и получил подобный эффект. Никто не делал listen и accept, а соединение established. Почему так?

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

> я думал вы питонщики :)

Я знаю питон (да и сокетные вызовы Питона идентичны Си), но вопрос в его изначальной постановке не понял.

> Мне казалось что чтобы сокет был доступен для коннект надо сделать listen и accept

Мне и до сих пор так кажется. Если тебя смущает вывод netstat, посмотри на TCP state machine - может, всё именно так и должно быть (я давно забыл диаграмму переходов).

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

Так connect-то проходит на сокет который не в состоянии LISTEN. Как это объяснить? Причём, если из другого процесса сделать connect то фиг, connection refused.

На фре та же фигня происходит.

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

Привет. Я тот самый anonymous :)

connect проходит даже без bind, если очень постаратся:

# cat Client.java
import java.net.*;
import java.io.*;

public class Client {
  
    public static void main(String [] args) throws Exception {
        SocketAddress addr = new InetSocketAddress("127.0.0.1", 40017);
        long attempt = 1;
        while (true) {
            Socket socket = new Socket();
            try {
                socket.connect(addr);
            } catch (ConnectException e) {
                attempt ++;
                continue;
            }
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            out.writeObject("Hello World");
            out.flush();
            Object read = in.readObject();
            socket.close();
            System.out.println(read);
            System.out.println("Connected to itself at attempt: " + attempt);
            break;
        }
    }
}

# java -cp . Client
Hello World
Connected to itself at attempt: 19962

Это и было причной проблемы, описанной в моем топике в Admin.
Причем работает не только на loopback интерфейсе. Наверное сетевой стек в linux страдает шизофринией, и иногда разговаривает сам с собой :)

А как в других ОС? Сетевые гуру отзовитесь...

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

> Привет. Я тот самый anonymous :)

Привет :)

> А как в других ОС? Сетевые гуру отзовитесь...

во фре те же яйца :). Лень в lkml писать, так что я забью на эту фичу. И так три баг-репорта ещё в питон предстоит оформить и отправить...

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