Създавам клас обвивка около класа 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
слушане/Client
преговаряне за свързване. Пише, че гнездото не е свързано. Та въпросът ми сега е:
Трябва ли 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