Perşembe, Haziran 08, 2006

Client/Server 4

FTP uygulamasini bu sefer socketlerle yaptik..

Client'ta ki farklar;

if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(-1);
}

memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_aton("127.0.0.1", &(server_addr.sin_addr));

if (connect(socketfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
exit(1);
} //socket acilmasi, degerlerinin set edilmesi ve socket uzerinden baglanti kurulmasi
------------------------------------------------------------------------------------------
write(socketfd, readbuffer, strlen(readbuffer)); //socket'e yazma!
close(socketfd); //islemlerden sonra socket;i kapatma.
------------------------------------------------------------------------------------------

Server'daki farklar;

if((orgsocketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket");
exit(-1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);

if(bind(orgsocketfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
perror("bind");
exit(-1);
}

if(listen(orgsocketfd, QUEUE_LENGTH) < 0){
perror("listen");
exit(-1);
}

client_len = sizeof(client_addr);
if((socketfd = accept(orgsocketfd, (struct sockaddr *)&client_addr, &client_len)) < 0){
perror("accept");
exit(-1);
}
//bind ve listen ve baglanti kabul (accept) islemleri...

Sinav sorusu: FTP uygulamasinin server-side kisminin yazilmasiydi. Server, socket acip bind ve listen islemlerini yapacak, client baglanti kurdugunda ise fork()'la yeni bir socket acip, veri alisverisini burdan gerceklestirmesini saglayacak..

Cevabi ozetlersek server;
sockfd = socket(...);
bind(sockfd, ...);
listen(sockfd,);
while(1){
new_fd = accept(sockfd,...);
if(!fork()){ //child process
close(sockfd); // child process kullanmayacak
send(new_fd); //veri transferi, ben bir message buffer ile yapiyorum.
close(new_fd); //socket ile isi biten child process socket'i kapatir
exit(0); //child process sonlaniyor.
}
close(new_fd); // parent process bu socketi kullanmayacak..
}
close(sockfd); //parent kullandigi socket'i kapatacak..

Bu odevin en eglenceli kismi hocamizin anlattiklariydi. Parayla odev yaptirilan bir siteye giren hocamiz, ogrencilerinden biriyle odev karsiliginda 10 dolara anlasir. Odev tarihi gelip odevini teslim alamayan ogrenci sinirlenir ve bir guzel sayar doker. Ardindan hoca ogrencisini odasina cagirir. 3 kisilik kahvalti masasinda anlatilan bu keyifli olayin ibreti alem olmasi icin nesilden nesile aktarilmasi uygun bulundu. O arkadas artik bir “IYTE” efsanesi!

Hiç yorum yok: