не могу найти сервер grpc с помощью socket.getservbyport

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

Я пытаюсь найти свой gRPC-сервер с помощью socket.getservbyport и получить исключение «порт / протокол не найден». Я знаю, что мой сервер работает на этом порту. что мне здесь не хватает?

сторона сервера:

from concurrent import futures

import logging

import grpc
from grpc_reflection.v1alpha import reflection

import helloworld_pb2
import helloworld_pb2_grpc


class Greeter(helloworld_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    SERVICE_NAMES = (
        helloworld_pb2.DESCRIPTOR.services_by_name['Greeter'].full_name,
        reflection.SERVICE_NAME,
    )
    reflection.enable_server_reflection(SERVICE_NAMES, server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()

сторона клиента:

import socket


def find_service_name():

  for port in [25, 80, 50051]:

    print("Port: %s => service name: %s" % (port, socket.getservbyport(port)))


def run():

    try:
        find_service_name()
    except Exception as  e:
        print(e)

    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
        print(response)


if __name__ == '__main__':
    logging.basicConfig()
    run()

выход:

Port: 25 => service name: smtp
Port: 80 => service name: http
port/proto not found
message: "Hello, you!"

person Yoni Sade    schedule 15.06.2020    source источник


Ответы (1)


getservbyport Python - это оболочка для системного вызова с таким же именем (см. соответствующий исходный код для cpython).

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

Функция getservbyport () возвращает структуру сервента для записи из базы данных, которая соответствует порту порта ...

база данных служб, к которой getservbyport обращается, просто (цитируется):

простой файл ASCII, обеспечивающий соответствие между понятными для человека текстовыми именами интернет-сервисов и соответствующими номерами портов и типами протоколов.

Итак, вы видите, что ваш сервер не отображается в базе данных служб. Это не удивительно, ведь AFAIK ничто не добавляло вашу службу в базу данных.

person Roy2012    schedule 15.06.2020
comment
Это ответ на ваш вопрос? - person Roy2012; 15.06.2020