저는 소켓 프로그래밍 (특히 비동기 소켓)에 익숙하지 않습니다. C# AsyncSockets, 전에 데이터를받지 않고 데이터를 보낼 위치?
가 나는AsynSocketserver
(내 클라이언트가 동기 소켓을 사용)
은 기본적으로 작동 얻기 위해이 튜토리얼 http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class을 사용했다. 클라이언트는 서버에 연결하여 데이터를 보내고 다시 에코를 가져올 수 있습니다. 나는 클라이언트가 어쩌면 (서버에 연결 서버에 일부 데이터를 보낼 수 싶어 이제
private void ProcessReceive(SocketAsyncEventArgs e) {
//check if remote host closed the connection
if (e.BytesTransferred > 0) {
if (e.SocketError == SocketError.Success) {
Token token = e.UserToken as Token;
token.SetData(e);
Socket s = token.Connection;
if (s.Available == 0) {
token.ProcessData(e);
}
bool IOPending = s.ReceiveAsync(e);
if (!IOPending) {
ProcessReceive(e);
}
//echo back
/* if (s.Available == 0) {
//set return buffer
token.ProcessData(e);
if (!s.SendAsync(e)) {
this.ProcessSend(e);
}
} else if (!s.ReceiveAsync(e)) {
this.ProcessReceive(e);
}*/
} else {
this.ProcessError(e);
}
} else {
this.CloseClientSocket(e);
}
}
private void ProcessSend(SocketAsyncEventArgs e) {
if(e.SocketError == SocketError.Success){
Token token = e.UserToken as Token;
if(!token.Connection.ReceiveAsync(e)){
this.ProcessReceive(e);
}
} else {
this.ProcessError(e);
}
}
:하지만,
I의 (a SocketListener
클래스)이 코드 (에코없이) 데이터를 수신 할 수있다 클라이언트가 처음에 서버에 일부 데이터를 보내고 서버에 연결하기 만하면되며 클라이언트가 서버에서 일부 데이터를받을 수 있어야합니다.
문제점 : 이전에 데이터를받지 않고 socketEventArgs.senAsync() - 메서드를 사용하는 방법이나 위치를 알 수 없습니다.
현재 내가 송신() 사용하고 - 방법 토큰 클래스에 새로운 AsyncEventArgs 객체를 생성하고 데이터를 전송하기 위해 저장 (토큰에) 연결을 사용하여 작동
public void send() {
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.UserToken = this;
args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
connection.SendAsync(args);
}
을, 그러나 이것은 잘못된 접근법 인 것 같습니다.
그렇다면 먼저 클라이언트로부터 데이터를받지 않고 열린 연결로 클라이언트에 데이터를 보내려면 어떻게해야합니까?
SocketAsyncEventArgs 인스턴스를 다시 사용하여 데이터를 수신하는 데 사용 된 인스턴스를 다시 사용하거나 모든 보낼 때마다 다시 사용되는 내 toke-class에서 글로벌 인스턴스를 만드시겠습니까? 데이터가 수신 된 인스턴스를 다시 사용함으로써 인스턴스가 데이터를 다시 수신하거나 데이터를 수신하도록 설정되어 있기 때문에 "System.InvalidOperationException"이 발생합니다. – Rul3r
@ Rul3r 전송 대 수신에 대한 별도의 인수 –