31 Ağustos 2015 Pazartesi

TCP istemci Soketi

C
socket ,connect, recv ve send metodları çağrılır.

struct sockaddr_in remote_addr;
char buf[BUFSIZ];
memset(&remote_addr, 0, sizeof(remote_addr));

remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr("192.168.103.128");
remote_addr.sin_port = htons(8000);

int s = socket(AF_INET, SOCK_STREAM, 0);


connect(s, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr));

int len = recv(s, buf, BUFSIZ, 0);
send(s,buf,SIZE,0);
close(s);
connect
Bu metod sadece Linux'ta eğer dinleyen socket kuyruğu (backlog) doluysa EAGAIN döner. Diğer işletim sistemleri ECONNREFUSED dönerler.

send
Metodun imzası şöyle
int send(int sockfd, const void *msg, int len, int flags); 

QT
QTcpSocket ve connectToHost metodları kullanılabilir. Örnek:
QTcpSocket socket;
socket.connectToHost(QHostAddress("172.0.0.1", 8080);
if (!socket.waitForConnected(5000)) {
    emit connectionFailed();
}

Java

İstemci socket açmak için :

C#
İstemci socket için TcpClient veya direkt Socket sınıfı kullanılabilir. 
Socket sınıfı
Asenkron bağlanma örneği
// Create a TCP/IP socket.
Socket client = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);

// Connect to the remote endpoint.
client.BeginConnect(remoteEP,
                new AsyncCallback(ConnectCallback), client);
Bağlanınca şu metod çağrılır
void ConnectCallback(IAsyncResult ar)
{
  // Retrieve the socket from the state object.
  Socket client = (Socket)ar.AsyncState;

  // Complete the connection.
  client.EndConnect(ar);
  
}

TcpClient sınıfı
TcpClient genelde GetStream()'in döndürdüğü akım ile kullanılıyor.

Connect Metodu
Bu metod IP adresi olarak bir string ve port numarası alır.
TcpClient c = new TcpClient();
c.Connect("10.0.0.4", 10);
GetStream metodu

C# ile Socket arayüzünü Stream olarak kullanabilmek te mümkün. Bu iş için NetworkStream sınıfı kullanılıyor. Bu sınıf Socket sınıfını stream'e çeviren bir adaptör.

Bağlandıktan sonra NetworkStream şöyle kullanılır.
NetworkStream ns = c.GetStream();
Stream üzerinden string göndermek için bir encoder aracılığıyla string byte[] haline çevrilir.
Stream ns = c.GetStream();

ASCIIEncoding transEncoded = new ASCIIEncoding();
byte[] bytes = transEncoded.GetBytes("Are You Kazaa?");
ns.Write(bytes, 0, bytes.Length);

byte[] byte2 = new byte[100];
int k = ns.Read(byte2, 0, 100);

c.Close();
Bu örnekte ASCII yerine UTF-8 kullanılıyor.
NetworkStream ns = c.GetStream();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("first");
ns.Write(buffer, 0, buffer.Length);


Hiç yorum yok:

Yorum Gönder