Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для WizarД
53 / 56 / 10
Регистрация: 07.02.2011
Сообщений: 556
Записей в блоге: 1

Async Socket Server, закрыть соединение

25.08.2012, 15:03. Показов 2147. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Нашел сервер на асинхронных сокетах, он работает, но проблема в другом.
Дело в том,что мой клиент так скажем требует закрытия соединений,но все было бы просто,если бы я не использовал Proxifier которые перенаправляет соединение на мой сервер.
В чем суть: обрабатывать socks 4 подключение было влом и я сделал так:
если кол-во полученных байтов =9 то отправить ответ в котором содержится информация о успешном подключении.
Далее проксифиер должен отправить настоящий пакет(по тому же сокету) и в итоге я должен отправить клиенту реальный ответ и при этом после отправки закрыть соединение.

В чем все дело: сервер работает не понятно как, он то принимает соединение, то отказывается отсылать ответ и при этом сразу же возрастает нагрузка на ЦП.
Сервер загружается на 100%.

Пример сервера взял с MSDN.


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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
 
// State object for reading client data asynchronously
public class StateObject {
    // Client  socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 4096;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
// Received data string.
    public StringBuilder sb = new StringBuilder();  
}
 
public class AsynchronousSocketListener {
    // Thread signal.
    public static ManualResetEvent allDone = new ManualResetEvent(false);
 
    public AsynchronousSocketListener() {
    }
 
    public static void StartListening() {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];
 
        // Establish the local endpoint for the socket.
        // The DNS name of the computer
        // running the listener is "host.contoso.com".
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
 
        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp );
 
        // Bind the socket to the local endpoint and listen for incoming connections.
        try {
            listener.Bind(localEndPoint);
            listener.Listen(100);
 
            while (true) {
                // Set the event to nonsignaled state.
                allDone.Reset();
 
                // Start an asynchronous socket to listen for connections.
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept( 
                    new AsyncCallback(AcceptCallback),
                    listener );
 
                // Wait until a connection is made before continuing.
                allDone.WaitOne();
            }
 
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
 
        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();
        
    }
 
    public static void AcceptCallback(IAsyncResult ar) {
        // Signal the main thread to continue.
        allDone.Set();
 
        // Get the socket that handles the client request.
        Socket listener = (Socket) ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
 
        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = handler;
        handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }
 
    public static void ReadCallback(IAsyncResult ar) {
        String content = String.Empty;
        
        // Retrieve the state object and the handler socket
        // from the asynchronous state object.
        StateObject state = (StateObject) ar.AsyncState;
        Socket handler = state.workSocket;
 
        // Read data from the client socket. 
        int bytesRead = handler.EndReceive(ar);
 
        if (bytesRead > 0) {
            // There  might be more data, so store the data received so far.
            state.sb.Append(Encoding.ASCII.GetString(
                state.buffer,0,bytesRead));
 
            // Check for end-of-file tag. If it is not there, read 
            // more data.
            content = state.sb.ToString();
            if (content.IndexOf("<EOF>") > -1) {
                // All the data has been read from the 
                // client. Display it on the console.
                Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                    content.Length, content );
                // Echo the data back to the client.
                Send(handler, content);
            } else {
                // Not all data received. Get more.
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
            }
        }
    }
    
    private static void Send(Socket handler, String data) {
        // Convert the string data to byte data using ASCII encoding.
        byte[] byteData = Encoding.ASCII.GetBytes(data);
 
        // Begin sending the data to the remote device.
        handler.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), handler);
    }
 
    private static void SendCallback(IAsyncResult ar) {
        try {
            // Retrieve the socket from the state object.
            Socket handler = (Socket) ar.AsyncState;
 
            // Complete sending the data to the remote device.
            int bytesSent = handler.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to client.", bytesSent);
 
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
 
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
    }
 
 
    public static int Main(String[] args) {
        StartListening();
        return 0;
    }
}
Если кто-то может дописать сюда пару строк чтобы все это работало - помогите пожалуйста.
Не хочу выкладывать сюда весь проект(слишком много всего).
все что надо - принять первые 9 байт и отослать 8, не закрывая соединения получить пакет отослать ответ и закрыть сокет.


Так же заметил,что на сервере висит сокет:
Миниатюры
Async Socket Server, закрыть соединение  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2012, 15:03
Ответы с готовыми решениями:

Socket.Send + Async & Await: свой асинхронный метод отправки данных
Привет. Хочу написать свой асинх. метод для отправки данных при помощи класса Socket и его метода Send. Работать должно так. Есть некий...

Sockets client+server with await/async c# 5.0
Уже долго пытаюсь найти хотя бы какой то пример, но пока безуспешно, поэтому обращаюсь с просьбой к вам. Проблема такова. Хочу написать...

Socket прослушивать исходящее http соединение
Необходимо прослушивать исходящее http соединение. Сейчас я использую Socket mainSocket = new...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2012, 15:03
Помогаю со студенческими работами здесь

Установить сетевое соединение без использования Socket
Доброе утро! Возможно ли в C# устанавливать сетевое соединение, не используя, явно или неявно, класс Socket? Спасибо.

Socket TCP: обрывается соединение после первого сообщения
Всем привет! Начал учить сокеты, написал по примере первую программу: клиент и сервер на TCP сокетах. Клиент подключается к серверу,...

Как корректно закрыть соединение TCP на стороне клиента
Код следующий: TcpClient client = new TcpClient(server, port); Byte data ; // Get a client stream for...

Socket Server/Client. Падение клиента при коннекте к серверу
В общем есть сервер: using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Закрыть соединение с локальной БД
Здравствуйте! Подскажите, пожалуйста. В своей программе использую локальную базу данных (Service-Based Database). Хочу сделать...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru