Answer the question
In order to leave comments, you need to log in
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
/////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 questionAsk a Question
731 491 924 answers to any question