Loading...
Select Version
&pagelevel(5)&pagelevel
The following two program examples illustrate how datagrams are received and sent with connectionless communications:
Example 1: Receiving datagrams
#include <sys.types.h>
#include <sys.socket.h>
#include <netinet.in.h>
#include <stdio.h>
#define TESTPORT 2222
/*
* The <netinet.in.h> header file declares sockaddr_in as follows:
*
* struct sockaddr_in {
* short sin_family;
* u_short sin_port;
* struct in_addr sin_addr;
* char sin_zero[8];
* };
*
* This program creates a socket, assigns it a name and then reads from
* the socket.
*/
main()
{
int sock, length, peerlen;
struct sockaddr_in name, peer;
char buf[1024];
/* Create the socket to be read from. */
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("opening datagram socket");
exit(1);
}
/* Assign the socket a name using wildcards */
name.sin_family = AF_INET;
name.sin_addr.s_addr = INADDR_ANY;
name.sin_port = htons(TESTPORT);
if (bind(sock, &name, sizeof name ) < 0) {
perror("binding datagram socket");
exit(1);
}
/* Read from socket. */
peerlen=sizeof peer;
if (recvfrom(sock, buf, 1024, &peer, &peerlen) < 0)
perror("receiving datagram packet");
else
printf("-->%s\n", buf);
soc_close(sock);
exit(0);
}
Example 2: Sending datagrams
#include <sys.types.h>
#include <sys.socket.h>
#include <netinet.in.h>
#include <netdb.h>
#include <stdio.h>
#define DATA "The sea is calm, the tide is full . . ."
/*
* This program sends a datagram to a receiver whose name is passed via
* the arguments in the command line.
*/
main(argc, argv)
int argc;
char *argv[];
{
int sock;
struct sockaddr_in name;
struct hostent *hp;
/* Create socket on which data is to be sent */
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("opening datagram socket");
exit(1);
}
/*
* Construct the name of the socket on which data is to be sent
* without using wildcards. gethostbyname() returns a structure
* containing the Internet address of the specified host. The
* port number is taken over from the command line.
*/
hp = gethostbyname(argv[1]);
if (hp == 0) {
fprintf(stderr, "%s: unknown host\n", argv[1]);
exit(2);
}
memcpy( (char *)&name.sin_addr, (char *)hp->h_addr,
hp->h_length);
name.sin_family = AF_INET;
name.sin_port = htons(atoi(argv[2]));
/* Send message. */
if (sendto(sock, DATA, sizeof DATA , 0, &name, sizeof name) < 0)
perror("sending datagram message");
soc_close(sock);
exit(0);
}