Я создаю класс-оболочку вокруг класса Socket
.
У меня есть обратный вызов асинхронного подключения, который делает это:
public void StartConnecting()
{
// Connect to a remote device.
try
{
//_acceptIncomingData = acceptIncomingData;
// Create a TCP/IP socket.
_workingSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
if (Information != null)
Information(this, new InfoEventArgs("Connecting", "Working socket is initiating connection"));
// Connect to the remote endpoint.
_workingSocket.BeginConnect(_localEndPoint,
new AsyncCallback(ConnectCallback), _workingSocket);
}
catch (Exception ex)
{
if (Error != null)
Error(this, new ErrorEventArgs(ex.Message, ex));
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
Socket client = (Socket)ar.AsyncState;
// Complete the connection.
client.EndConnect(ar);
// ACTION CONNECTED COMPLETE
if (Information != null)
Information(this, new InfoEventArgs("Connected", "Working socket has now connected"));
// Start Receiving on the socket
// Create the state object.
StateObject state = new StateObject();
state.workSocket = client;
// Begin receiving the data from the remote device.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
catch (Exception ex)
{
if (Error != null)
Error(this, new ErrorEventArgs(ex.Message, ex));
}
}
И для объекта состояния он использует предопределенный класс:
public class StateObject
{
// Client socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 1024;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}
Я использую это для подключения к сокету, который начал прослушивание, я называю этот прослушивающий сокет Server
, и он использует класс Socket
. Приведенный выше код представляет собой сокет, который я называю Client
. Когда Client
подключается к Server
, Client
теперь разрешено отправлять данные на Server
. Однако, когда я хочу получить данные, отправленные из Server
, я получаю следующее сообщение об ошибке:
Запрос на отправку или получение данных был отклонен, поскольку сокет не подключен и (при отправке на сокет дейтаграммы с помощью вызова sendto) не был указан адрес.
Что мне не хватает? или не правильно делаешь?
После того, как мне было предложено проверить, прослушивает ли Server
, я посмотрел на то, что я называю WorkingSocket
в моем классе-оболочке, который является используемым сокетом, я проверил это после успешного согласования Server
listen/Client
connect. Пишет, что сокет не подключен. Итак, мой вопрос сейчас:
Нужно ли Server
(прослушивающий сокет) подключаться к Client
для отправки данных, как это сделать, если у вас есть один Server
для многих Client
?
telnet <address> <port>
? - person Nikolai Fetissov   schedule 28.01.2013telnet 127.0.0.1 11000
? т.е. мой вопрос - ваш сервер слушает? - person Nikolai Fetissov   schedule 28.01.2013