C Soket Programlama #3 Live Server
Ö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/