@Kle6800

Как можно получить IP адрес с которого была отправлена команда/символы?

Можете подсказать задача такая чтобы в таблицу писать все то что приходит на порт TCP

Удалось реализовать то что я в БД пишу в корректном виде все то что приходит на сервер , но есть задача также писать с какого адреса приходит данное сообщение

/*
Демон слушает порт TCP и пишет в БД что получил
 */
package main

import (
	"fmt"
	"net"
	"bufio"
	"time"
	"os"
	"log"
	//"unicode/utf8"
	"database/sql"  ///пакет для работы с БД
	_ "github.com/lib/pq" //пакет для работы с БД
    "strings" // only needed below for sample processing
)
func init() {
	start := time.Now()
	log.Println("Демон Стартовал:",start)
}
const (
	DB_HOST		        = "127.0.0.1"
	DB_USER    	        = "postgres"
	DB_PASSWORD 	    = "postgres"
	DB_NAME     	    = "freeswitch"
)
var (
	err error
	db *sql.DB  /// для работы с запросами в БД
)
/////функция проверки на ошибки
func checkErr(err error) {
	if err != nil {
		fmt.Println(err)
	}
}
func main() {
	// Bind на порт ОС
	listener, _ := net.Listen("tcp", ":5000")
	for {
		// ждём пока не придёт клиент
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Can not connect!!")
			conn.Close()
			continue
		}
		fmt.Println("Connected")
		// создаём Reader для чтения информации из сокета
		bufReader := bufio.NewReader(conn)
		fmt.Println("Start reading")
		go func(conn net.Conn) {   ////делаю многопоточность чтобы не блокировать сокет
		defer conn.Close()
		for {
			// побайтово читаем
			rbyte, err := bufReader.ReadByte()
			if err != nil {
				fmt.Println("Can not read!", err)
				break
			}
			fmt.Print(string(rbyte))  /////вывожу в принт то что пришло.
			//log.Print(string(rbyte))  /////вывожу в принт то что пришло.
			message, _ := bufio.NewReader(conn).ReadString('\n')
			fmt.Print("Message Received:", string(message))
			newmessage := strings.ToUpper(message)
			conn.Write([]byte(newmessage + "\n"))
			data := string(message)
			log.Print("Текст СМС ",data)
            /////коннект к БД
			db_property := "host=" + DB_HOST + " user=" + DB_USER + " password=" + DB_PASSWORD + " dbname=" + DB_NAME + " sslmode=disable"
			db, err = sql.Open("postgres", db_property)
			err = db.Ping()
			defer db.Close() ///закрываем коннект к Базе данных
			_, err = db.Exec("INSERT INTO smpp (sms,state) VALUES ($1, 'active')", data)  // Метод db.Exec() применяется, когда нужно сделать однократное обращение к базе, не требующее возврата данных.
			checkErr(err)
			///проверяю есть ли лог файл если нет создаю
			f, err := os.OpenFile("smpp.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
			if err != nil {
				log.Fatal(err)
			}
			defer f.Close()
			log.SetOutput(f)
		}
		}(conn)
	}
}
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
@Kle6800 Автор вопроса
/////Узнаю С какого IP адреса пришел коннект
go func(c net.Conn ) {
fmt.Println(c.RemoteAddr().String())
ip := c.RemoteAddr().String()
fmt.Print("Текст СМС ",data,"IP адрес с которого пришел запрос ",ip)
_, err = db.Exec("INSERT INTO smpp (sms,state,ip) VALUES ($1, 'active' , $2)", data,ip) // Метод db.Exec() применяется, когда нужно сделать однократное обращение к базе, не требующее возврата данных.
checkErr(err)
}(conn)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы