2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
1
.NET 4.x

Как получить ответ от сервера (tcpclient)?

28.02.2011, 17:03. Показов 3144. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
сервер слушает порт

Код
radist04ka@ sockstat | grep Temp
radist   Temp0   2909  3  tcp4   *:9666                *:*
и отвечает если пришел определенный текст:

Код
radist04ka@ telnet 127.0.0.1 9666
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TEST
OK
Connection closed by foreign host.
radist04ka@ telnet 127.0.0.1 9666
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GETTEST
:99.9:99.9:99.9:999:999:88.88:
Connection closed by foreign host.
radist04ka@
в логах:
Feb 28 16:55:44 radist04ka meteo9[2909]: Accept connection from 127.0.0.1:17988
Feb 28 16:55:46 radist04ka meteo9[2909]: got: "TEST^M "
Feb 28 16:55:46 radist04ka meteo9[2909]: answer: "OK "
сервер работает нормально.

надо написать клиента под VB.NET
сделал:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Module Module1
 
 
    Public Sub TcpGetTest()
        Dim Test As String
        Try
            Dim tc As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient()
            tc.Connect(Form1.TextBox1.Text, Form1.ComboBox15.Text)
            Dim ns As System.Net.Sockets.NetworkStream = tc.GetStream()
            Dim connected As Boolean = True
            While connected = True
                Dim body As String = "TEST"
                Dim message() As Byte = System.Text.Encoding.UTF8.GetBytes(body)
                ns.Write(message, 0, message.Length)
                Dim buffer() As Byte = New Byte(80) {}
                ns.Read(buffer, 0, buffer.Length)
                Test = (System.Text.Encoding.UTF8.GetString(buffer))
            End While
            tc.Close()
        Catch ex As Exception
        End Try
    End Sub
 
End Module
отсылается запрос нормально, в логах отражено.
а как ответ получить? ответ идет по другому порту, судя по логам:

Feb 28 16:59:24 radist04ka meteo3[2897]: Accept connection from 192.168.50.188:9353
Feb 28 16:59:24 radist04ka meteo3[2897]: got: "TEST"
Feb 28 16:59:24 radist04ka meteo3[2897]: answer: "OK "
Feb 28 17:00:06 radist04ka meteo5[2901]: Accept connection from 192.168.50.188:9354
Feb 28 17:00:06 radist04ka meteo5[2901]: got: "TEST"
Feb 28 17:00:06 radist04ka meteo5[2901]: answer: "OK "
Feb 28 17:00:09 radist04ka meteo8[2907]: Accept connection from 192.168.50.188:9355
Feb 28 17:00:09 radist04ka meteo8[2907]: got: "TEST"
Feb 28 17:00:09 radist04ka meteo8[2907]: answer: "OK "
как получить ответ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2011, 17:03
Ответы с готовыми решениями:

Как получить ответ от сервера?
Здравствуйте. Принимаю запрос с сервера вот таким кодом : HttpWebRequest WReq =...

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

Как получить ответ от сервера?
Как мне получить ответ от сервера с помощью класса HttpResponseMessage ? если мне надо не только...

Как получить ответ с сервера Winsock'ом?
У меня есть код отправляющий данные серверу, приходят ответные данные и записываются в переменную....

19
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
28.02.2011, 21:55 2
Опять велосипед изобретаем? AxWinsock,TcpClient и прочие шплости
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
01.03.2011, 01:38  [ТС] 3
в той теме четко задано на каком порту посылать и на каком получать..
а у меня неизвестно на каком порту мне ответят

и у меня клиент тока... не сервер....
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 10:25 4
Цитата Сообщение от QweЯty Посмотреть сообщение
в той теме четко задано на каком порту посылать и на каком получать..
а у меня неизвестно на каком порту мне ответят

и у меня клиент тока... не сервер....
Я понять не могу, что ты хочешь? там есть и клиент и сервер готовые уже, возьми да переделай под свои нужды.
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
01.03.2011, 10:32  [ТС] 5
сервер никоим образом не имеет отношения к VB

он написан на с и пашет под BSD.

все что он делает, тока слушает порт и отвечает если пришел определенный запрос.

мне клиент нужен. чтобы посылал этот запрос и получал ответ от сервера.

запрос на сервер отправляется, но я не знаю как получить с него данные, которые он отправляет
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 11:11 6
Цитата Сообщение от QweЯty Посмотреть сообщение
сервер никоим образом не имеет отношения к VB

он написан на с и пашет под BSD.

все что он делает, тока слушает порт и отвечает если пришел определенный запрос.

мне клиент нужен. чтобы посылал этот запрос и получал ответ от сервера.

запрос на сервер отправляется, но я не знаю как получить с него данные, которые он отправляет
Давай ip сервера, порт, сокетный он или нет?

Добавлено через 28 минут
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Imports Microsoft.VisualBasic
'(Сервер, получающий ответ!)
Public Partial Class MainForm
Private ListenerThread As Threading.Thread
 
 
        Public Sub New()
                ' The Me.InitializeComponent call is required for Windows Forms designer support.
Me.InitializeComponent()
ListenerThread = New Threading.Thread(AddressOf DoListen)
listenerThread.IsBackground = True
ListenerThread.Start()
        End Sub
 Public Shared data As String = Nothing
 
Private Sub DoListen()
 
Dim bytes() As Byte = New [Byte](1024) {}
Dim listener As New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
Dim remoteEP As New IPEndPoint(ipAddress.any,9666)
listener.Bind(remoteEP)
listener.Listen(10)
        While True
            Dim handler As Socket = listener.Accept()
            data = Nothing
            While True
                bytes = New Byte(1024) {}
                Dim bytesRec As Integer = handler.Receive(bytes)
                data += Encoding.UTF8.GetString(bytes, 0, bytesRec)
                If data.IndexOf("*") > -1 Then
                    Exit While
                End If
            End While
 
            If textbox2.InvokeRequired Then
textbox2.beginInvoke(New Threading.ThreadStart(AddressOf DoSomeActions))
            Else
        DoSomeActions
End If
            handler.Shutdown(SocketShutdown.Both)
            handler.Close()
        End While
end sub
 
Sub DoSomeActions
        textbox2.Text =  textbox2.text & vbCrLf & (data)
        dim length = textBox2.Text.Length
        textBox2.Select(length, 0)
        textBox2.ScrollToCaret()
End Sub
 
 
 
'Клиент (посылает сообщение серверу)
 
Sub Button1Click(sender As Object, e As EventArgs)    
        try
        dim send As New Socket(AddressFamily.InterNetwork, _
            SocketType.Stream, ProtocolType.Tcp)
            Dim bytes(1024) As Byte
dim ipadresq as string = textbox3.text
Dim ip As System.Net.IPAddress = System.Net.IPAddress.Parse(ipadresq)
Dim remoteEP As New IPEndPoint("ip сервера", 9666)
send.Connect(remoteEP)
Dim body As String = textbox1.text
Dim message() As Byte = Encoding.UTF8.GetBytes(body)
Dim bytesSent As Integer = send.Send(message)
send.Shutdown(SocketShutdown.Both)
send.Close()
        Else
                End If
        Catch ex As Exception
        end try
    End Sub
Делаешь форму, на нее 3 textbox a:
textbox1 - вводишь сообщение для сервера
textbox2 - получаешь ответ
textbox3 - ip адрес сервера
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
01.03.2011, 18:02  [ТС] 7
вроде сокетный.
а нельзя модулем это сделать?

ip 10.10.241.124 port 9666
текст только слово TEST

а получить сообщения пока что просто вывод в messagebox...

что то как не пытался так и непонял..
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 18:12 8
Цитата Сообщение от QweЯty Посмотреть сообщение
вроде сокетный.
а нельзя модулем это сделать?

ip 10.10.241.124 port 9666
текст только слово TEST

а получить сообщения пока что просто вывод в messagebox...

что то как не пытался так и непонял..
Если ты хочешь получать от сервера ответ, то тебе нужен не только клинет,но еще и свой сервер (2 в 1), щас я тебе накидаю.

Добавлено через 2 минуты
А можешь этот сервер сюда кинуть? Он под виндой пашет?
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
01.03.2011, 18:15  [ТС] 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
radist04ka# cat radiktemp0.c
#include <sys/types.h>
#include <sys/socket.h>
 
#include <netinet/in.h>
#include <arpa/inet.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
 
#define SERVER_ADDRESS          "0.0.0.0"
#define SERVER_DATA             "./meteo.dat"
#define SERVER_NAME             "meteo0"
#define SERVER_PORT             9734
#define TCP_BACKLOG             15
#define MAX_LINE_LEN            80
 
int main()
{
        struct sockaddr_in addr;
        socklen_t addrlen;
        FILE *file;
        int client_fd, n, on, server_port, server_fd;
        char *data_path, *server_address;
        char buf[MAX_LINE_LEN];
 
        /* Defaults. */
        data_path = SERVER_DATA;
        server_address = SERVER_ADDRESS;
        server_port = SERVER_PORT;
 
        /* Setup listener. */
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(server_port);
        if (inet_aton(server_address, &addr.sin_addr) == 0)
                errx(1, "invalid listen address \"%s\"", server_address);
        if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
                err(1, "socket");
        on = 1;
        if (setsockopt(server_fd, SOL_SOCKET,
            SO_REUSEADDR, &on, sizeof(on)) != 0)
                err(1, "setsockopt");
        if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
                err(1, "bind");
        if (listen(server_fd, TCP_BACKLOG) != 0)
                err(1, "listen");
 
        /* Daemonize. */
        if (daemon(1, 1) == -1)
                err(1, "cannot daemonize");
        openlog(SERVER_NAME, LOG_PID | LOG_NDELAY, LOG_DAEMON);
        syslog(LOG_INFO, "Waiting for connections on %s port %d",
            inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
 
        /* Loop. */
        while(1) {
                /* Handle connection. */
                memset(&addr, 0, sizeof(addr));
                addrlen = sizeof(addr);
                client_fd = accept(server_fd, (struct sockaddr *)&addr, &addrlen);
                if (client_fd == -1) {
                        syslog(LOG_ERR, "accept(): %s", strerror(errno));
                        continue;
                }
                syslog(LOG_INFO, "Accept connection from %s:%d",
                    inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
 
                n = read(client_fd, &buf, sizeof(buf) - 1);
                if (n < 1) {
                        syslog(LOG_ERR, "read(): %s. Closing connection",
                            strerror(errno));
                        close(client_fd);
                        continue;
                }
                buf[n] = 0;
                syslog(LOG_INFO, "got: \"%s\"\n", buf);
 
                if (strncmp(buf, "TEST", 4) == 0) {
                        strncpy(buf, "OK\n", sizeof(buf) -1);
                        buf[sizeof(buf) - 1] = 0;
                } else if(strncmp(buf, "GETTEST", 7) == 0) {
                        file = fopen(data_path, "r");
                        if (file == NULL ||
                            fgets(buf, sizeof(buf), file) == NULL) {
                                syslog(LOG_ERR, "file: %s", strerror(errno));
                                strncpy(buf, "ERR\n", sizeof(buf) -1);
                                buf[sizeof(buf) - 1] = 0;
                        }
                        if (file)
                            fclose(file);
                } else {
                        syslog(LOG_INFO, "bad command, closing connection");
                        close(client_fd);
                        continue;
                }
 
                syslog(LOG_INFO, "answer: \"%s\"\n", buf);
                write(client_fd, &buf, strlen(buf));
                close(client_fd);
        }
}
 
radist04ka#
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 18:28 10
А сам сервер? я в С не очень, скорее совсем...
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
01.03.2011, 18:37  [ТС] 11
это и есть сервер
он не подвиндой, он на FreeBSD запущен.
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 18:44 12
Цитата Сообщение от QweЯty Посмотреть сообщение
это и есть сервер
он не подвиндой, он на FreeBSD запущен.
ща, пишу уже, может подойдет для твоего, нет, значит еще подумаем!
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 18:55 13
Вот, для проверки можешь ввести свой ip и тебе придет сообщение в соседний текстбокс
Вложения
Тип файла: zip Radist.zip (35.4 Кб, 12 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
01.03.2011, 19:23 14
Ну как? оно Михалыч?
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
02.03.2011, 01:00  [ТС] 15
Ошибка 1 Для предложения "Handles" требуется переменная с модификатором "WithEvents", определенная во вмещающем типе или в одном из его базовых типов. C:\Documents and Settings\Loner\Рабочий стол\Radist\Radist\Radist\MainForm.vb 60 91 radist
вот таки

версии походу не совпадают
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
02.03.2011, 13:52 16
Попробуй консольный вариант из той темы с 1 страницы (только ip и порт свои вставь)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
02.03.2011, 15:51 17
Попробуй с этими, если не выйдет, то попробуй сменить ip сервера с 127.0.0.1 на твой адрес в локальной сети.
Вложения
Тип файла: zip tcp.zip (37.0 Кб, 13 просмотров)
0
2 / 2 / 2
Регистрация: 11.10.2010
Сообщений: 186
02.03.2011, 16:48  [ТС] 18
_Лёша_,

tcp.zip

клиент отправляет данные:
Mar 2 16:38:40 radist04ka meteo9[89417]: Accept connection from 192.168.50.188:20241
Mar 2 16:39:02 radist04ka meteo9[89417]: got: "TEST"
Mar 2 16:39:02 radist04ka meteo9[89417]: answer: "OK "
Mar 2 16:41:57 radist04ka meteo9[89417]: Accept connection from 192.168.50.188:20245
Mar 2 16:42:02 radist04ka meteo9[89417]: got: "TEST"
Mar 2 16:42:02 radist04ka meteo9[89417]: answer: "OK "
но "сервер" не получает ничего, так как он слушает порт 9666
ответ то приходит на порт в 1м случае на 20241 и во 2м на 20245 порты...

щаз пояснили принцип работы

[16:26:14] <Ilya> пробую объяснить на пальцах
[16:26:45] <Ilya> сервер слушает какой-то порт на определенном адресе или адресах
[16:26:57] <radist> так
[16:27:06] <Ilya> клиент приходит на этот адрес
[16:27:25] <Ilya> между ними устанавливается соединене
[16:27:32] <radist> угу
[16:27:57] <Ilya> сервер_адрес:порт <-> клиент_адрес:порт
[16:28:26] <Ilya> ответ на порт отличный от порта клиента - бессмысленен
[16:28:38] <Ilya> кто его там слушать то будет?
как в VB определить на каком порту слушать в связке клиент_адрес:порт

Добавлено через 2 минуты
p.s. а если все делать в цикле когда произошло соединение?

VB.NET
1
2
3
4
            While connected = True
                                'отправляет запрос
                                'принимаем ответ
             End While
по идее тогда не нужно знать на каком порту приходит сообщение...

Добавлено через 12 секунд
p.s. а если все делать в цикле когда произошло соединение?

VB.NET
1
2
3
4
            While connected = True
                                'отправляет запрос
                                'принимаем ответ
             End While
по идее тогда не нужно знать на каком порту приходит сообщение...
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
02.03.2011, 18:30 19
Вот тебе на 2 твоих порта сразу. Для такких вещей многопоточность существует.
Вложения
Тип файла: zip Сервер.zip (19.1 Кб, 15 просмотров)
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
04.03.2011, 12:39 20
Ну че подошло или нет?
0
04.03.2011, 12:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2011, 12:39
Помогаю со студенческими работами здесь

Как правильно получить ответ от сервера
Юзаю rad studio 2010 TcpClient1-&gt;Connect(); TcpClient1-&gt;Open(); TcpClient1-&gt;SendBuf(...

Как проверить ответ сервера и получить массив c id?
Всем приветы! Специалисты, помогите пожалуйста. Вот есть такой код $query = &quot;SELECT thumbnail,...

Как получить ответ сервера,несмотря на 403 ошибку?
Собсно сабж,после некоего обновления на одном форуме при гет запросе(из программы) на форум выходит...

Как получить напрямую ответ сервера СУБД используя TQuery?
День добрый! Есть проблема. Для доступа к базе данных использую компонент TQuery(могу использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru