C Soket Programlama #2 – Server oluşturuyoruz

Sat, Apr 22, 2017 2-minute read

Bu yazımızda bir soket oluşturup onu belirli bir porta bind ediyoruz.

socket oluşturmayı 1.yazımızda anlamıştık. Şimdi bind komutuyla portu alıyoruz.

int socket_desc;
struct sockaddr_in server;
     
//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");
}
puts("bind done");

Bu noktada 2 farklı soketin aynı portu bind edemeyeceğini anlamış oluyoruz.

Port açtıysak bunu dinleyelim.

Bunun için listen fonksiyonunu kullanacağız.

listen(socket_desc , 3);

yukarıdaki kodlara listen eklersek

kodları derleyip çalıştırırsak. Tarayıcımıza localhost:8888 adresini gitmesini söylememiz o sokete erişilmesini sağlamak için yeterlidir.

listen fonksiyonu 2 tane parametre alıyor. Soketimiz ve o anda kaç client listen edeceğinin sayısını(backlog). Eğer buraya 0dan küçük bir sayı girersek yine 0 olarak başlatacaktır.

#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
 
int main(int argc , char *argv[])
{
    int socket_desc , new_socket , c;
    struct sockaddr_in server , client;
     
    //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");
    }
    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");
    }
     
    puts("Connection accepted");
 
    return 0;
}

Burada yeni bir sokete accept fonksiyonunu atıyoruz.

accept fonksiyonu elimizdeki soketteki aynı tip protokol ve adres ailesini kullanarak yeni soket oluşturuyor.

3 tane parametre alır. Bunlar oluşturduğumuz soket , bind edilen soketin adresi ve adres_len.

new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);

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