|
LABORATORIYALIQ JUMIS - 8 Tema: C++ programmalastırıw tilinde potoklar (fork, select) menen islew
|
bet | 11/12 | Sana | 09.01.2024 | Hajmi | 5,27 Mb. | | #132866 |
Bog'liq Linux qq (2)1 LABORATORIYALIQ JUMIS - 8 Tema: C++ programmalastırıw tilinde potoklar (fork, select) menen islew.
Jumıstıń maqseti: C++ programmalastırıw tili arqalı TCP hám UDP server den paydalanıwdı úyreniw.
TEORIYALÍQ BÓLIM
Aldınǵı sabaqlarda biz TCP server hám UDP serverin kórgen edik. Biraq endi biz bir waqtıniń ózinde TCP echo serverimiz hám iterativ UDP serverimizdi TCP hám UDP soketlarin multiplekslaw ushın tańlawdan paydalanatuǵın birden-bir serverge birlestire alamız.
Tańlaw funksiyası TCP hám UDP rozetkaların tańlaw ushın isletiledi. Bul funkciya yadroǵa bir neshe hádiyselerdiń hár qanday júz beriwin kútiw ushın kórsetpeler beredi hám processn tek bir yamasa bir neshe hádiyse júz bergennen yamasa belgilengen waqıt ótkennen keyin oyatadı.
Mısal - yadro tek bul shártlerden biri júz bergende qaytadı
• {1, 2, 3} den qálegen deskriptor oqıwǵa tayın
• {4, 5, 6} den qálegen deskriptor jazıwǵa tayın
• waqıt 5 sekund ótti
Pútkil processti tómendegi basqıshlarǵa bóliw múmkin:
Server:
1. TCP, yaǵnıy tıńlaw soketin jaratıń
2. UDP soketin jaratıń
3. Eki rozetkan da server adresine jalǵań.
4. Biz kútken maksimal 2 identifikatorn tańlaw hám esaplaw ushın xarakteristikalawshılar kompleksin jumısqa túsiriń
5. Qońırawdı saylań hám tayın deskriptorn alın (TCP yamasa UDP)
6. Eger tayın identifikator TCP bolsa, jańa jalǵanıwdı basqarıń yamasa eger tayın deskriptor UDP bolsa, datagramnı alıń.
UDP klienti:
1. UDP soketin jaratıń.
2. Serverge xabar jiberiń.
3. Serverden juwap alinbaǵanǵa shekem kútıń.
4. Soket deskriptorin jabıń hám shıǵıń.
TCP klienti:
1. TCP soketin jaratıń.
2. Server menen baylanıs ornatıw ushın qońıraw etiń.
3. Jalǵanıw qabıl etilgende serverge xabar jazıń.
4. Serverdiń juwabın oqiń.
5. Soket deskriptorin jabıń hám shıǵıń.
Kerekli funksiyalar:
int select (int maxfd, fd_set *readsset, fd_set *writeset,
fd_set *excepcet, const struct timeval *timeout);
Argumentler:
• maxfd: tayın xarakteristikalawshılardıń maksimal sanı.
• vaqt tawısıwı: Qaytıw ushın tańlaw ushın qansha kútiw kerek.
struct timeval{
long tv_sec;
long tv_usec;
};
if timeout==NULL then wait forever
if timeout == fixed_amount_time then wait until specified time
if timeout == 0 return immediately.
• readset: Biz yadronı oqıw ushın sinap ko'riwdi qáleytuǵın deskriptorlar to'plamı.
• writeset: Biz yadro jazıwdı sınap kóriwdi qáleytuǵın deskriptorlar kompleksi.
• excepcet: Biz yadronı esaptan tısqarı jaǵdayların sınap kóriwdi qáleytuǵın deskriptorlar kompleksi.
• int read (int sockfd, void * buff, size_t nbytes);
Argumentler:
1. sockfd: maǵlıwmatlardı qabıl etiwshi deskriptor.
2. buff: Qosımsha buferi soketi deskriptor maǵlıwmatları bul buferge kóshiriledi.
3. nbaytlar: Qosımsha buferine nusqalanatuǵın báyitler sanı.
// Server program
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 5000
#define MAXLINE 1024
int max (int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main ()
{
int listenfd, connfd, udpfd, nready, maxfdp1;
char buffer[MAXLINE];
pid_t childpid;
fd_set rset;
ssize_t n;
socklen_t len;
const int az waqıt = 1;
struct sockaddr_in cliaddr, servaddr;
char* message = " Hello Client";
void sig_chld (int);
/* create listening TCP socket */
listenfd = socket (AF_INET, SOCK_STREAM, 0);
bzero (&servaddr, sizeof (servaddr));
servaddr. sin_family = AF_INET;
servaddr. sin_addr. s_addr = htonl (INADDR_ANY);
servaddr. sin_port = htons (PORT);
// binding server addr structure tap listenfd
bind (listenfd, (struct sockaddr*) &servaddr, sizeof (servaddr));
listen (listenfd, 10 );
/* create UDP socket */
udpfd = socket (AF_INET, SOCK_DGRAM, 0);
// binding server addr structure tap udp sockfd
bind (udpfd, (struct sockaddr*) &servaddr, sizeof (servaddr));
// clear the descriptor set
FD_ZERO (&rset);
// get maxfd
maxfdp1 = max (listenfd, udpfd) + 1;
for (;;) {
// set listenfd and udpfd ın readset
FD_SET (listenfd, &rset);
FD_SET (udpfd, &rset);
// select the ready descriptor
nready = select (maxfdp1, &rset, NULL, NULL, NULL);
// if tcp socket iyis readable then handle
// ıyt by accepting the connection
if (FD_ISSET (listenfd, &rset)) {
len = sizeof (cliaddr);
connfd = accept (listenfd, (struct sockaddr*) &cliaddr, &len);
if ((childpid = fork ()) == 0) {
close (listenfd);
bzero (buffer, sizeof (buffer));
printf (" Message From TCP client: ");
read (connfd, buffer, sizeof (buffer));
puc (buffer);
write (connfd, (const char*) message, sizeof (buffer));
close (connfd);
exit (0);
}
close (connfd);
}
// if udp socket iyis readable receive the message.
if (FD_ISSET (udpfd, &rset)) {
len = sizeof (cliaddr);
bzero (buffer, sizeof (buffer));
printf (" \nMessage from UDP client: ");
n = recvfrom (udpfd, buffer, sizeof (buffer), 0,
(struct sockaddr*) &cliaddr, &len);
puc (buffer);
sendto (udpfd, (const char*) message, sizeof (buffer), 0,
(struct sockaddr*) &cliaddr, sizeof (cliaddr));
}
}
}
Tcp client
// TCP Client program
#include
#include
#include
#include
#include
#include
#define PORT 5000
#define MAXLINE 1024
int main ()
{
int sockfd;
char buffer[MAXLINE];
char* message = " Hello Server";
struct sockaddr_in servaddr;
int n, len;
// Creating socket file descriptor
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
printf (" socket creation failed");
exit (0);
}
memset (&servaddr, 0, sizeof (servaddr));
// Filling server information
servaddr. sin_family = AF_INET;
servaddr. sin_port = htons (PORT);
servaddr. sin_addr. s_addr = inet_addr (" 127. 0. 0. 1");
if (connect (sockfd, (struct sockaddr*) &servaddr,
sizeof (servaddr)) < 0) {
printf (" \n Error: Connect Failed \n");
}
memset (buffer, 0, sizeof (buffer));
strcpy (buffer, " Hello Server");
write (sockfd, buffer, sizeof (buffer));
printf (" Message from server: ");
read (sockfd, buffer, sizeof (buffer));
puc (buffer);
close (sockfd);
}
Udp client
// UDP client program
#include
#include
#include
#include
#include
#include
#include
#define PORT 5000
#define MAXLINE 1024
int main ()
{
int sockfd;
char buffer[MAXLINE];
char* message = " Hello Server";
struct sockaddr_in servaddr;
int n, len;
// Creating socket file descriptor
if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
printf (" socket creation failed");
exit (0);
}
memset (&servaddr, 0, sizeof (servaddr));
// Filling server information
servaddr. sin_family = AF_INET;
servaddr. sin_port = htons (PORT);
servaddr. sin_addr. s_addr = inet_addr (" 127. 0. 0. 1");
// send hello message tap server
sendto (sockfd, (const char*) message, strlen (message),
0, (const struct sockaddr*) &servaddr,
sizeof (servaddr));
// receive server's response
printf (" Message from server: ");
n = recvfrom (sockfd, (char*) buffer, MAXLINE,
0, (struct sockaddr*) &servaddr,
&len);
puc (buffer);
close (sockfd);
return 0;
}
Joqarıdaǵı kodlardı kompilyaciya qılıw hám jumısqa túsiriw basqıshları:
1. Server programmasın kompilyaciya qılıw (gcc server. c -o ser)
2. (. /ser) járdeminde serverdi jumısqa túsiriń
3. Basqa terminalda tcp klient programmasın kompilyaciya etiń (gcc tcp_client. c -o tcpcli)
4. tcp klientin jumısqa túsiriw (. /tcpcli)
5. Basqa terminalda udp klient programmasın kompilyaciya etiń (gcc udp_client. c -o udpcli)
6. Udp klientin jumısqa túsiriw (. /udpcli)
Joqarıdaǵı kodlardıń nátiyjesi
|
| |