| Application | http | user-level daemon |
| Presentation | ||
| Session | ||
| Transport | TCP | kernel (user |
| Network | IP | kernel |
| Link | Ethernet (frames) | Hardware/firmware/device driver; uses software-maintained addresses |
| Physical | Ethernet (physical) | hardware |
A socket is the end-point for bidirectional
For Internet services using TCP or UDP, your service name is your port number. Important services use well-known port numbers, assigned by the IANA.
// Server code in C
// adapted from http://en.wikipedia.org/wiki/Berkeley_sockets
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
int main()
{
struct addrinfo hint;
struct sockaddr_storage bindaddr_storage;
struct sockaddr_in6 *bindaddr6 =
(struct sockaddr_in6 *)&bindaddr_storage;
struct sockaddr_in *bindaddr =
(struct sockaddr_in *)&bindaddr_storage;
struct addrinfo *result;
struct sockaddr_storage peer;
int peersize;
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
int retval;
int i32SocketFD = socket(PF_INET6, SOCK_STREAM, 0);
char msg[] = "Success!\n";
if(-1 == i32SocketFD)
{
perror("can not create socket");
exit(-1);
}
bzero(&bindaddr_storage, sizeof(bindaddr_storage));
bindaddr6->sin6_family = AF_INET6;
bindaddr6->sin6_addr = in6addr_any; /* struct assignment */
bindaddr6->sin6_port = htons(12345);
if(-1 == bind(i32SocketFD,(struct sockaddr*) bindaddr6,
sizeof(struct addrinfo)))
{
printf("error bind failed");
perror("main");
exit(-1);
}
if(-1 == listen(i32SocketFD, 10))
{
printf("error listen failed");
exit(-1);
}
// Here, you should print out your local address using
// getsockname() and getnameinfo() (and gai_strerror on error)
for(; ;)
{
int i32ConnectFD = accept(i32SocketFD, NULL, NULL);
if(0 > i32ConnectFD)
{
// improve error reporting here, using perror()
printf("error accept failed");
exit(-1);
}
// Here, you should print out your local address
// and the peer address using
// getsockname(), getpeername(), and getnameinfo()
// (and gai_strerror on error)
// perform read write operations ...
// add error checking and reporting here
write(i32ConnectFD, msg, sizeof(msg));
// wait one minute; this lets us see the connection in place, and
// even see the behavior as we try to start a second connection
// at the same time
sleep(60);
// add error checking and reporting here
shutdown(i32ConnectFD, 2);
// add error checking and reporting here
close(i32ConnectFD);
}
// add error checking and reporting here
close(i32SocketFD);
return 0;
}
In Linux, as in most Unix systems, the L2
[rdv@localhost Desktop]$ route -v -A inet Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 133.27.56.0 * 255.255.248.0 U 0 0 0 ath1 default gw2-v20.sfc.kei 0.0.0.0 UG 0 0 0 ath1
[rdv@localhost Desktop]$ route -v -A inet6 Kernel IPv6 routing table Destination Next Hop Flags Metric Ref Use Iface 2001:200:1c0:2000::/64 * UA 256 104 0 ath1 fe80::/64 * U 256 0 0 ath1 */0 fe80::213:5fff:fecd:dc00 UGDA 1024 22 0 ath1 localhost6.localdomain6/128 * U 0 1 1 lo 2001:200:1c0:2000:219:7dff:fe0c:f94/128 * U 0 304 1 lo fe80::219:7dff:fe0c:f94/128 * U 0 4 1 lo ff02::1/128 ff02::1 UC 0 6 0 ath1 ff02::1:ff83:8338/128 ff02::1:ff83:8338 UC 0 5 0 ath1 ff00::/8 * U 256 0 0 ath1
A very common security bug is to allow the caller of a
![]() |
![]() |
![]() |