C Soket Programlama #3 Live Server

Sun, Apr 23, 2017 2-minute read

Önceki yazımızda client ile bağlantı kurmuş ve hemen sonlandırmıştık. Bu yazımızda açtığımız soket ile bağlantıları aktif olarak değerlendireceğiz.

Bağlanan clientin ip adresini öğrenmek için bu 2 satır bize yeterli olacak. İlk yazıda bahsettiğimiz gibi veri tip dönüşümleri yapıyoruz.

char *client_ip = inet_ntoa(client.sin_addr);
int client_port = ntohs(client.sin_port);

Aşağıdaki kodda soket oluşturup onu 8888 numaralı porta bind ediyoruz. Daha sonra listen ile bağlantıları dinlemeye başlıyoruz. Gelen bağlantıyı accept ile kabul ediyoruz. Bu bağlantıya mesajımızı yazdırıp sonlandırıyoruz.

#include<stdio.h>
#include<string.h>    //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h>    //write
 
int main(int argc , char *argv[])
{
    int socket_desc , new_socket , c;
    struct sockaddr_in server , client;
    char *message;
     
    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }
     
    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );
     
    //Bind
    if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("bind failed");
        return 1;
    }
    puts("bind done");
     
    //Listen
    listen(socket_desc , 3);
     
    //Accept and incoming connection
    puts("Waiting for incoming connections...");
    c = sizeof(struct sockaddr_in);
    new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
    if (new_socket<0)
    {
        perror("accept failed");
        return 1;
    }
     
    puts("Connection accepted");
     
    //Reply to the client
    message = "Hello Client , I have received your connection. But I have to go now, bye\n";
    write(new_socket , message , strlen(message));
     
    return 0;
}

Burada tıpkı dosyaya yazdırıyormuş gibi write fonksiyonunu kullanabiliriz.

write 3 parametre alır. Bunlar yazdırılacak adres , içerik ve içeriğin boyutudur.

Eğer UNIX/LINUX tabanlı bir işletim sistemindeyseniz telnet localhost 8888 yazarak oluşturduğumuz servera erişebiliriz.

Ve karşımıza mesajımız gelir.

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello Client , I have received your connection. But I have to go now, bye
Connection closed by foreign host.

Şimdi bu serverı hep aktif tutacağız. Bunun için accept fonksiyonunu bir while döngüsü içine alıyoruz. Böylelikle birden fazla client bağlanabiliyor.

while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
    {
        puts("Connection accepted");
         
        //Reply to the client
        message = "Hello Client , I have received your connection. But I have to go now, bye\n";
        write(new_socket , message , strlen(message));
    }
     
    if (new_socket<0)
    {
        perror("accept failed");
        return 1;
    }
     
    return 0;

kaynak : http://www.binarytides.com/socket-programming-c-linux-tutorial/