Conexiunea server-to-client: accept()

Realizată de către server, după listen().

Serverul va accept() solicitarea de conexiune via socketul specificat, şi va returna newlycreated socket pentru utilizarea în comunicarea retur pentru clientul cu accept().

Serverul are un socket pentru acceptarea solicitărilor de conexiuni care sosesc.

  • crează alţi (noi) sockeţi pentru comunicarea cu clienţii

Serverul nu poate accept() selectiv solicitările de conexiune.

int accept ( int sockfd, struct sockaddr *fromaddrptr, int *addresslen)

sockfd este valoarea de retur variabil asignată a socket()}.

*fromaddrptr este adresa structurii sockaddr_in conţinând informaţii despre adresa socketului care transmite datele. Este o valoare de retur.

addresslen este dimensiunea structurii adresei. Un argument cu valoare rezultată (se ajustează înainte de apel, se resetează în timpul apelului).

struct sockaddr_in other_app_addr;
int sockid, newsockid, addrsize;
...
addrsize = sizesizeof(other_app_addr));
newsockid = accept(sockfd, (struct sockaddr *)
&other_app_addr, &addrsize);
/* newsockid to communicate with client,
sockid to accept more connections */

O aplicaţie simplă cu evoluţie în timp: 1

Client:

  • conectare la server

  • transmite clientului server timpul local

  • citeşte returul privind timpul local al serverului.

Server:

  • primeşte conexiuni de la clienţi

  • afişează timpul local al clientului

  • transmite timpul local al serverului clientului.

O aplicaţie simplă cu evoluţie în timp: codul client

1
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <time.h>
7 #include <errno.h>
8 #define MY_PORT_ID 6090 /* a number > 5000 */
9 #define SERV_HOST_ADDR „128.119.40.186” /* Jim’s host machine */
10 main()
11 {
12 int sockid;
13 struct sockaddr_in ssock_addr;
14 struct timeval tp;
15 struct timezone tzp;
16
17 /* create a socket */
18 if ( (sockid = socket(AF_INET, SOCK_STREAM, 0)) < 0)
19 { printf(„error creating client socket, error%dn”,errno); exit(0); }
20
21
 
22 /* name the socket using wildcards*/
23 bzero((char *) &ssock_addr, sizeof(ssock_addr));
24 ssock_addr.sin_family = AF_INET;
25 ssock_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
26 ssock_addr.sin_port = htons(MY_PORT_ID);
27
28 if (bind (sockid, (struct sockaddr *) &ssock_addr, sizeof(ssock_addr)) < 0)
29 { printf(„error connecting to server, error: %dn”,errno); exit(0); }
30 /* send time of day */
31 gettimeofday(&tp,&tzp);
32 /* convert from host octet order to network octet order */
33 printf(„client: local time is %ldn”,tp.tv_sec);
34 tp.tv_sec = htonl(tp.tv_sec);
35 tp.tv_usec = htonl(tp.tv_usec);
36
37 /* send time of day to other side */
38 write(sockid, &tp, sizeof(tp));
39 /* get time of day back fro other side and display */
40 if ( (read(sockid, &tp, sizeof(tp))) < 0)
41 { printf(„error reading new socketn”); exit(0); }
42
43 /* convert from network octet order to host octet order */
44 tp.tv_sec = ntohl(tp.tv_sec);
45 tp.tv_usec = ntohl(tp.tv_usec);
46 printf(„client: remote time is %ldn”,tp.tv_sec);
47 close(sockid);

O aplicaţie simplă cu evoluţie în timp: cod server

1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <time.h>
7 #include <errno.h>
8 #define MY_PORT_ID 6090 /* a number > 5000 */
9
10 main()
11 {
12 int sockid, newsockid, i,j;
13 struct sockaddr_in ssock_addr;
14 struct timeval tp;
15 struct timezone tzp;
16
17 /* create a socket */
18 if ( (sockid = socket (AF_INET, SOCK_STREAM, 0)) < 0)
19 { printf(„error creating socket, error: %dn”,errno); exit(0); }
20 /* do a man on errno to get error information */
21 /* name the socket using wildcards */
22 bzero((char *) &ssock_addr, sizeof(ssock_addr));
23 ssock_addr.sin_family = AF_INET;
24 ssock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
> 25 ssock_addr.sin_port = htons(MY_PORT_ID);
26 /* bind the socket to port address */
27 if ( ( bind(sockid, (struct sockaddr *) &ssock_addr, sizeof(ssock_addr)) < 0) )
28 { printf(„error binding socket, error: %dn”,errno); exit(0); }
 
29 /* start accepting connections */
30 if ( listen(sockid, 5) < 0)
31 { printf(„error listening: %dn”,errno); exit(0); }
32
33 for (i=1; i<=50000 ;i++) {
34 /* accept a connection */
35 newsockid = accept(sockid, (struct sockaddr *)0, (int *)0);
36 if (newsockid < 0)
37 { printf(„error accepting socket, error: %dn”,errno); exit(0); }
38 /* read remote time of day from socket */
39 if ( (read(newsockid, &tp, sizeof(tp))) < 0)
40 { printf(„error reading new socketn”); exit(0); }
41 /* convert from network octet order to host octet order */
42 tp.tv_sec = ntohl(tp.tv_sec);
43 tp.tv_usec = ntohl(tp.tv_usec);
44 printf(„server: remote time is %ldn”,tp.tv_sec);
45
46 /* get local time of day and send to client*/
47 for (j=0; j<1000000; j++)
48 ; /* delay */
49 gettimeofday(&tp,&tzp);
50 /* convert from host octet order to network octet order */
51 printf(„server: local time is %ldn”,tp.tv_sec);
52 tp.tv_sec = htonl(tp.tv_sec);
53 tp.tv_usec = htonl(tp.tv_usec);
54 write(newsockid, &tp, sizeof(tp));
55 close(newsockid);
56 }
57 close(sockid);

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *