14 Ekim 2008 Salı

client-server

CLIENT KISMI

#include
#include
#include
#include
#include
#include
#include
#include
#include

#define PORT 3490 // client’ In baGlantI kuracaGI port
#define MAXDATASIZE 128 // bir seferde gonderilecek maksimum veri boyutu

#define LSTARGMN "-l" // dosya listesini talep etmek için komut satırından
// girilecek parametre
#define LSTMESAJ "\f" // liste talebini karşı tarafına iletirken kullanılan mesaj
#define DOSYAYOK "\f\f" // karşı tarafta olmayan bir dosya talep edildiGinde karSI
// tarafIn gOndermesi gereken mesaj

// mesaj bilgisi transferi iCin EOF - filefeed karakterlerinin kullanIlmasInIn sebebi;
// bu karakterin herhangi bir dosya ismi bildirmesinin mUmkUn olmamasI, dolayIsIyla muhtemel
// bir karISIklIGIn OnUne geCilmesidir.

int main(int argc, char *argv[])
{
int sockfd, numbytes;
char sndbuf[MAXDATASIZE], rcvbuf[MAXDATASIZE];
struct sockaddr_in their_addr; // karSI tarafIn adresini tutan yapI
FILE *ofp; // outfile pointer, karSIdan alInan karakterler
// bu pointer’ a yOnlendirilerek dosyaya
// yazImI saGlanmaktadIr.

int dosyaliste; // dosya listesi talep edildiGini gOsterir bayrak.

if ( !( (argc == 4) || ((argc == 3) && (!strcmp(argv[2], LSTARGMN))) )) {
fprintf(stderr, "usage1: sftpcli \n");
fprintf(stderr, "usage2: sftpcli -l\n");
exit(1);
}

if ( dosyaliste = ( (argc == 3) && (!strcmp(argv[2], LSTARGMN)) ) )
strcpy(argv[2], LSTMESAJ); // dosya listesi talebi argUman olarak komut satIrIna
// veridiGinde karSI tarafa gOnderilecek mesajIn
// iCerisine mesajI iCerir string kopyalanmaktadIr.

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

their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT); // short, network byte dUzeni.
inet_aton(argv[1], &(their_addr.sin_addr)); // komut satIrIndan alInan ilk argUman.
// socket adres yapIsIna gOmUlUyor.
bzero(&(their_addr.sin_zero), 8); // yapInIn geri kalanI sIfIrlanIyor.

if (connect(sockfd, (struct sockaddr *)&their_addr,
sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}

if (send(sockfd, argv[2], strlen(argv[2]), 0) == -1) {
perror("send"); // Dosya isminin ya da liste istek
exit(1); // mesajInIn gOnderilmesi
}

if (!dosyaliste) // dosya listesi talep edilmediyse
ofp = fopen(argv[3], "w"); // diske yazmak iCin dosya aC.

while ((numbytes = recv(sockfd, rcvbuf, MAXDATASIZE-1, 0)) > 0) {
// karSIdan dosya verileri alInIyor.
rcvbuf[numbytes] = ’\0’;
if (!strcmp(rcvbuf, DOSYAYOK)) { // alInan bilgi olmayan dosyayI belirtmiyorsa.
fprintf(stderr, "server’ da bu isimle bir dosya yok.\n");
close(sockfd);
fclose(ofp);
exit(1);
}
printf("%s",rcvbuf);
if (!dosyaliste)
fprintf(ofp, "%s", rcvbuf);
}

printf("\nnumbytes:%d\n", numbytes);

if (!dosyaliste) // dosya aCIldIysa kapatIlmalIdIr.
fclose(ofp);

close(sockfd);

return 0;
}


server KISMI



#include
#include
#include
#include
#include

#define MYPORT 3490 // client’ larIn baGlanacaklarI port numarasI
#define BACKLOG 10 // kabul edilecek maksimum kullanIcI queue kapasitesi
#define MAXDATASIZE 128 // bir seferde gonderilecek maksimum veri boyutu

#define LSTARGMN "-l" // dosya listesini talep etmek için komut satırından
// girilecek parametre
#define LSTMESAJ "\f" // liste talebini karşı tarafına iletirken kullanılan mesaj
#define DOSYAYOK "\f\f" // karşı tarafta olmayan bir dosya talep edildiGinde karSI
// tarafIn gOndermesi gereken mesaj

main()
{
int sockfd, new_fd; // sock_fd den dinle, new_fd yeni baGlantI.
struct sockaddr_in my_addr; // benim adres bilgim bu yapIda saklanIr.
struct sockaddr_in their_addr; // bize baGlanan client’ In adresi.
FILE *ifp; // in file pointer, okunan dosyayI temsil eder.

char rcvbuf[MAXDATASIZE], sndbuf[MAXDATASIZE]; // send buffer - receive buffer.
char *gez; // stringler üzerinde iSlem yaparken kullanIlan
// gezici pointer.
int sin_size;

int numbytes, numfilechar, c, i;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT); // network byte dUzeni.
my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // IP’ mi otomatik al.
bzero(&(my_addr.sin_zero), 8); // yapInIn geri kalanI sIfIrlanIyor.


if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind");
exit(1);
}

if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}

while (1) { // temel accept() dOngUsU
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,
&sin_size)) == -1) {
perror("accept");
continue;
}

printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));

if (!fork()) { // child process.
close(sockfd); // child, parent’ ın dosya tanImlayIcIsIna ihtiyaC duymaz.

rcvbuf[0] = ’\0’; // rcvbuf’ In iCi temizleniyor.
if ( (numbytes = recv(new_fd, rcvbuf, MAXDATASIZE-1, 0)) == -1) // dosya adI alInIyor.
perror("Dosya adi aliminda hata");
rcvbuf[numbytes] = ’\0’;

if (! strcmp(rcvbuf, LSTMESAJ)) { // gelen mesaj, dosya listesini talep eden bir mesaj ise
system("ls -al > liste"); // dosya listesini al ve liste adlı bir dosyaya yaz.
strcpy(rcvbuf, "liste"); // liste dosyasI talep edilmiS gibi rcvbuf’ a kopyala.
}

if (ifp = fopen(rcvbuf, "r")) { // talep edilen dosyayI okuma modunda aC.

gez = sndbuf; // gez’ i sndbuf’ In baSIna Cek.
numfilechar = 0; // okunan karakter = 0.

while (( c = getc(ifp)) != EOF) { // dosya sonuna gelene kadar okumaya devam et.
if (numfilechar++ < MAXDATASIZE-2)
*(gez++) = c; // okunan karakter gez vasItasIyla sndbuf Uzerine
else { // iSlenmektedir. Buffer’ ın sonuna gelmeden Once
*(gez++) = c; // string olabilmesi iCin karakter dizisinin sonuna
*(gez) = ’\0’; // ’\0’ karakteri de koyulmalIdIr.
if (send(new_fd, sndbuf, strlen(sndbuf), 0) == -1) // oluSturulan buffer string
perror("send"); // karSI tarafa yollanIr.
printf("\nSent: %s\n", sndbuf);

gez = sndbuf;
numfilechar = 0;
}
}

if (numfilechar) { // MAXDATASIZE tamamlanmadan
*(gez) = ’\0’; // dosya sonuna eriSilirse dosya-
if (send(new_fd, sndbuf, strlen(sndbuf), 0) == -1)
perror("send"); // nIn son parCasI gOnderilmeden
printf("\nSent: %s\n", sndbuf); // kalIr. Bu kod parCasI kalan
} // kIsmI gOndermeye yarar.


fclose(ifp); // okunan dosya kapatIlIr.
}
else { // talep edilen dosya yoksa;
strcpy(sndbuf, DOSYAYOK); // sndbuf’ a hata mesajInI yaz.
if (send(new_fd, sndbuf, strlen(sndbuf), 0) == -1) // karSI tarafa yolla.
perror("send");
printf("Sent: FileFeed: \" \\\f\" as an error message...\n");
}


close(new_fd);
exit(0); // iSi biten child process hafIzadan silinmelidir.
}
else // listen() islemine devam eden ana program
close(new_fd); // ana programın buna ihtiyacI yoktur.


}

return 0;

}

0 Yorum: