S
S
Sergey2017-08-23 16:50:24
go
Sergey, 2017-08-23 16:50:24

How can I get the IP address from which the command/characters were sent?

Can you suggest a task such that in the table to write everything that comes to the TCP port
I managed to implement what I write in the database in the correct form everything that comes to the server, but there is also a task to write from which address this message comes

/*
Демон слушает порт 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)
  }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
S
Sergey, 2017-08-23
@Kle6800

/////Find out what IP address the connection came
from go func(c net.Conn ) {
fmt.Println(c.RemoteAddr().String())
ip := c.RemoteAddr().String()
fmt.Print ("SMS text ",data,"IP address from which request came ",ip)
_, err = db.Exec("INSERT INTO smpp (sms,state,ip) VALUES ($1, 'active' , $2)", data,ip) // The db.Exec() method is used when you need to make a single call to the database that does not require data to be returned.
checkErr(err)
}(conn)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question