C Socket Programlama #1

Mon, Mar 13, 2017 2-minute read

Bu yazıda C kullanarak soket oluşturup bir servera bağlanıyoruz. Bağlandığımız servera soket aracılığıyla iletişim kurarak mesaj gönderiyor ve cevabı bir diziye aktarıyoruz.

BU YAZIDAKI KODLAR LINUX DAĞITIMLARI İÇİN DENENMİŞTİR. WİNDOWS KULLANICILARI EĞER ÇALIŞMAYAN FONKSİYONLAR OLURSA HEADERLARI DEĞİŞTİRMELİDİR

Kodlarımızı bu linkten alıyoruz.

Öncelikle bir soket oluşturuyoruz.

socket(AF_INET , SOCK_STREAM , 0);

Burada AF_INET IPv4 kullanacağımızı belirtiyor. IPv6 için AF_INET6 kullanabiliriz.

SOCK_STREAM ise hangi soketin hangi tipi kullanacağını aktarıyor. Burada TCP kullanıyoruz.

0 ise ip protokolü için eklendi.

server.sin_addr.s_addr = inet_addr("172.217.22.14");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

server adında bir struct oluşturduk. Bunun içerisine bağlanacağımız ipyi aktarmamız gerekiyor. Soketlerde ipler long tipine dönüştürülmesi gerektiği için inet_addr fonksiyonunu kullanarak struct içindeki değişkenimize aktarıyoruz.

Yine aynı struct içerisinde IPv4 ailesini kullanacağımızı belirttikten sonra bağlantı portumuzu yazıyoruz. Burada da portu htons fonksiyonu ile göndermemiz gerekiyor.

connect(socket_desc , (struct sockaddr *)&server , sizeof(server))

connect() fonksiyonu ile belirlediğimiz servera bağlantı kurmaya çalışacağız.

ilk olarak oluşturduğumuz soketi ve server için oluşturduğumuz struct yapsını ve bunun boyutunu parametre olarak gönderiyoruz. Eğer 0dan küçük bir değer üretirse bağlantı sağlanamamıştır.

send(socket_desc , message , strlen(message) , 0)

Artık bağlantı kurduğumuza göre servera mesaj gönderebiliriz.

Bunun için send() fonksiyonunu kullanarak oluşturduğumuz soketi , göndermek istediğimiz mesajı ve bu mesajın boyutunu paremetre olarak iletiyoruz. Yine connect fonksiyonunda olduğu gibi burada da gönderim hatası olursa gelen değer 0dan küçük olacaktır. Eğer büyükse mesaj başarıyla iletilmiştir.

recv(socket_desc, server_reply , 2000 , 0)

Mesajıda gönderme işlemi başarıyla tamamladıysak artık serverın cevabını alabiliriz.

recv() fonksiyonu kullandığımız soketi ve cevabın yazılacağı char değişkeninin boyutunu alarak bize cevabı iletir.

#include <stdio.h>
#include <string.h>    //strlen
#include <sys/socket.h>
#include <arpa/inet.h> //inet_addr
 
int main(int argc , char *argv[])
{
    int socket_desc;
    struct sockaddr_in server;
    char *message , server_reply[2000];
     
    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }
         
    server.sin_addr.s_addr = inet_addr("172.217.22.14");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );
 
    //Connect to remote server
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }
     
    puts("Connected\n");
     
    //Send some data
    message = "a";
    if( send(socket_desc , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
    puts("Data Send\n");
     
    //Receive a reply from the server
    if( recv(socket_desc, server_reply , 2000 , 0) < 0)
    {
        puts("recv failed");
    }
    puts("Reply received\n");
    puts(server_reply);
    close(socket_desc);
    return 0;
}