1 / 18

Design, implementation and evaluation issues of local area network devices 期末 DEMO

Design, implementation and evaluation issues of local area network devices 期末 DEMO Elementary SCTP Socket Functions & Client/Server Example 694430007 陳旻槿. SCTP Socket Types Maintain consistency with the existing sockets APIs

mira-weeks
Download Presentation

Design, implementation and evaluation issues of local area network devices 期末 DEMO

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Design, implementation and evaluation issues of local area network devices 期末DEMO Elementary SCTP Socket Functions & Client/Server Example 694430007 陳旻槿

  2. SCTP Socket Types • Maintain consistency with the existing sockets APIs • The SCTP sockets API extension must stay consistency with the existing UDP,TCP,IPv4,and IPv6 sockets API. • SCTP socket API comes in two forms: one-to-one and one-to-many. • The one-to-one used to be called the a “TCP style” socket. • The one-to-many at one time was known by the “UDP style” socket.

  3. Functions Discussion socket() • Applications calls socket() to create a socket descriptor to represent an SCTP endpoint. bind() • Applications use bind() to pass an address to be associated with an SCTP endpoint to the system. listen() • Applications use listen() to ready the SCTP endpoint for accepting inbound associations. accept() • Applications use accept() call to remove an established SCTP association from the accept queue of the endpoint.

  4. Functions Discussion connect() • Applications use connect() to initiate an association to a peer. sendmsg() and recvmsg() • An application uses sendmsg() and recvmsg() call to transmit data to and receive data from its peer. close() • Applications use close() to gracefully close down an association. sctp_bindx() • Allows an application to bind a set of addresses instead of one or all addresses.

  5. sctp_initmsg() • SCTP_INITMSG – Can be used to get or set the default INIT/INIT-ACK settings such as number of streams allowed in or requested out. sctp_sendmsg() • This call will allow the caller to specify on the command line things like the stream number and other SCTPish information to be sent with a message. sctp_recvmsg() • This call is used to receive a message but also a sctp_sndrcvinfo structure with details on the message (e.g. The stream number and stream sequence number).

  6. SCTP one-to-one style socket • A typical server in one-to-one style uses the following system call sequence to prepare an SCTP endpoint for servicing requests: 1. socket() 2. bind() 3. listen() 4. accept() 5. close()

  7. A typical client uses the following system call sequence to setup an association with a server to request services: 1. socket() 2. connect() 3. close() • After returning from connect(), the client uses send and recv calls to send out requests and receive responses from the server.

  8. Server(connection-oriented protocol) socket() single addresses multiple addresses Client (connection-oriented protocol) bind() sctp_bindx() listen() socket() accept() blocks until connection from client SCTP_INITMSG connect() data (request) send() or sendmsg() recv() or recvmsg() process request data (reply) send() or sendmsg() recv() or recvmsg() close() close()

  9. one-to-many style socket • A typical server using a one-to-many style socket will do a socket() call, followed by a listen() and sendmsg() / recvmsg(). • Note that the connect() and accept() call are not needed. • A typical server in this style uses the following socket calls in sequence to prepare an endpoint for servicing requests: 1. socket() 2. bind() 3. listen() 4. recvmsg() and sendmsg() 5. close()

  10. A typical client uses the following calls in sequence to setup an association with a server to request services: • 1. socket() • 2. sendmsg() • 3. recvmsg() • 4. close()

  11. Server socket() bind() Client listen() socket() data (request) sendto( )/ sendmsg() recvfrom() / recvmsg() process request data (reply) sendto( )/ sendmsg() recvfrom() / recvmsg() close() close()

  12. Multi-streaming demo • This example presents a server that implements a form of the daytime protocol. • This traditional server emits the current time to a connected client, but for SCTP, I emit the local time on stream 0 and Greenwich Mean Time (GMT) on stream 1.

  13. Server Client socket() socket() bind() listen() Connection establishment accept() connect() Stream 0 sctp_ sendmsg() Sctp_recvmsg Stream 1 sctp_ sendmsg() Sctp_recvmsg Connection termination close() close() Sockets functions used in the multi-streaming daytime server and client

  14. Server code (1/2) • int main() • { • int listenSock, connSock, ret; • struct sockaddr_in servaddr; • char buffer[MAX_BUFFER+1]; • time_t currentTime; • /* Create SCTP TCP-Style Socket */ • listenSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP ); • /* Accept connections from any interface */ • bzero( (void *)&servaddr, sizeof(servaddr) ); • servaddr.sin_family = AF_INET; • servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); • servaddr.sin_port = htons(MY_PORT_NUM); • /* Bind to the wildcard address (all) and MY_PORT_NUM */ • ret = bind( listenSock,(struct sockaddr *)&servaddr, sizeof(servaddr) ); • /* Place the server socket into the listening state */ • listen( listenSock, 5 );

  15. Server code (2/2) • /* Server loop... */ • while( 1 ) { • /* Await a new client connection */ • connSock = accept( listenSock,(struct sockaddr *)NULL, (int *)NULL ); • /* New client socket has connected */ • /* Grab the current time */ • currentTime = time(NULL); • /* Send local time on stream 0 (local time stream) */ • snprintf( buffer, MAX_BUFFER, "%s\n", ctime(&currentTime) ); • ret = sctp_sendmsg( connSock,(void *)buffer, (size_t)strlen(buffer), • NULL, 0, 0, 0, LOCALTIME_STREAM, 0, 0 ); • /* Send GMT on stream 1 (GMT stream) */ • snprintf( buffer, MAX_BUFFER, "%s\n", asctime( gmtime( &currentTime ) ) ); • ret = sctp_sendmsg( connSock,(void *)buffer, (size_t)strlen(buffer), • NULL, 0, 0, 0, GMT_STREAM, 0, 0 ); • /* Close the client connection */ • close( connSock ); • } • return 0;}

  16. Client code (1/2) • int main() • { • int connSock, in, i, flags; • struct sockaddr_in servaddr; • struct sctp_sndrcvinfo sndrcvinfo; • struct sctp_event_subscribe events; • char buffer[MAX_BUFFER+1]; • /* Create an SCTP TCP-Style Socket */ • connSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP ); • /* Specify the peer endpoint to which we'll connect */ • bzero( (void *)&servaddr, sizeof(servaddr) ); • servaddr.sin_family = AF_INET; • servaddr.sin_port = htons(MY_PORT_NUM); • servaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); • /* Connect to the server */ • connect( connSock, (struct sockaddr *)&servaddr, sizeof(servaddr) ); • /* Enable receipt of SCTP Snd/Rcv Data via sctp_recvmsg */ • memset( (void *)&events, 0, sizeof(events) ); • events.sctp_data_io_event = 1; • setsockopt( connSock, SOL_SCTP, SCTP_EVENTS, • (const void *)&events, sizeof(events) );

  17. Client code (1/2) • /* Expect two messages from the peer */ • for (i = 0 ; i < 2 ; i++) { • in = sctp_recvmsg( connSock, (void *)buffer, sizeof(buffer), • (struct sockaddr *)NULL, 0, • &sndrcvinfo, &flags ); • /* Null terminate the incoming string */ • buffer[in] = 0; • if (sndrcvinfo.sinfo_stream == LOCALTIME_STREAM) { • printf("(Local) %s\n", buffer); • } else if (sndrcvinfo.sinfo_stream == GMT_STREAM) { • printf("(GMT ) %s\n", buffer); } • } • /* Close our socket and exit */ • close(connSock); • return 0; • }

More Related