Sockets w aplikacji

0

Witam,
potrzebuję prostej aplikacji wykorzystującej windows sockets. Aplikacja a wysyłać komendy telenet do serwera na odpowiedni porcie. Jest to serwer automatyki domowej a ja chcę zrobić mały panel dotykowy.

Założenie jest takie, że po uruchomieniu aplikacji łączy się ona z serwerem a pod poszczególnymi przyciskami są zakodowane instrukcje.Moja widza programistyczna jest zerowa. Udało mi się jednak z pomocą kilku tutoriali rozwiązać łączenie się natomiast przesyłanie komend nie działa.

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;

namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            clientSocket.Connect("172.16.135.130", 6860);
            label1.Text = "Client Socket Program - Server Connected ...";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NetworkStream serverStream = clientSocket.GetStream();

            byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET G:"gbnusss" END");

            serverStream.Write(outStream, 0, outStream.Length);

            serverStream.Flush();



        
        }
    }
}

Komenda musi być wysyłana w formie

#GET
G:"sciezka"
END

Czy ktoś mógłby mnie poratować gotowcem, bądź tłumaczeniem krok po kroku. Podejrzewam, że dla osoby obeznanej z programowaniem jest to jedna z podstaw.
Jeśli będzie potrzeba mogę zlecić odpłatne przygotowanie szablonu. Zależy mi na czasie.

Z góry dziękuję

0

Nie działa - cóż to znaczy? Jakiś wyjątek? Serwer nie odbiera danych?

0
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET G:"gbnusss" END");

Te poszczególne komendy nie powinny być od siebie odseparowane np. znakiem nowej linii?

0
xeo545x39 napisał(a):

Nie działa - cóż to znaczy? Jakiś wyjątek? Serwer nie odbiera danych?

Serwer nie odbiera danych

DibbyDum napisał(a):
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET G:"gbnusss" END");

Te poszczególne komendy nie powinny być od siebie odseparowane np. znakiem nowej linii?

Tak, komendy powinny byc zakonczone nową linią czy mam to zrobić w taki sposób:

byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET\r\nG:"gbnusss"\r\nEND"); 

Wyszukałem specyfikację połączenia:

Port number- The Windows socket connection uses port 6860.
Type of data exchange - The text data strings defined in the protocol are sent via the Windows socket connection

The TP Com service waits for incoming TCP/IP telegrams to a defined port. The default value
for the port is 6860. A Windows socket connection is opened for data exchange.
The default value of the receive and send buffer length of the Windows socket is 1,500 bytes. In the TP Com service, a so-called session is started for each established Window socket connection; this session manages the set configuration of each connection separately.
If a message is received from the TP Com interface and exceeds the set buffer (memory for clipboarding data), the request is not executed and an error response is issued instead. The next valid request message (starting with #) is used.A message does not necessarily have to be sent with a single TCP/IP telegram. Fragmenting of the
messages is normal, especially if the message length exceeds the MTU (Maximum Transmission Unit, corresponds to the maximum package size).

Communication via TCP/IP is basically asynchronous and bidirectional

the preset codepage is 1252 Western European (Windows).

Zastanawia mnie jeszcze kodowanie. W przykładzie, który ja znalazłem jest ASCII a powinno być Windows1252. Jednak nie widzę takiego kodowania tutaj:

https://msdn.microsoft.com/pl-pl/library/ds4kkd55(v=vs.110).aspx

0
filu25 napisał(a):

Zastanawia mnie jeszcze kodowanie. W przykładzie, który ja znalazłem jest ASCII a powinno być Windows1252. Jednak nie widzę takiego kodowania tutaj:

https://msdn.microsoft.com/pl-pl/library/ds4kkd55(v=vs.110).aspx

Spróbuj

Encoding.GetEncoding("Windows-1252").GetBytes(...) 
0

Dziękuję za wszystkie podpowiedzi jednak nic nie pomogło. Zastanawiam się czy w ogóle w odpowiedni sposób próbuję przesłać komendy. Jeśli łączę się do serwera przez telnet to dostaję odpowiedź (informację o błędzie) nawet na losowy ciąg znaków. Przy próbie wysłania z programu nic.

Czy można w sposób taki jak potrzebuję - zakodowanie pod przyciskiem - przesyłać komendy telnet?

0

Tylko zapisujesz, więc nie masz skąd dostać odpowiedzi z błędem - bo trzeba by ją odczytać.

Windows-1252, ASCII, UTF-8 to identyczne kodowanie w zakresie znaków 0-127, dopóki nie przesyłasz znaków powyżej 127 możesz się nie martwić stroną kodową.

1 użytkowników online, w tym zalogowanych: 0, gości: 1