Professional Documents
Culture Documents
NTV 1
Nội dung
Socket
TCP Socket
UDP Socket
Cài đặt
NTV 2
Socket
NTV 3
Lịch sử
NTV 4
Thiết kế
NTV 5
Cách nhìn
Với HĐH
giao tiếp truyền thông
Cài đặt giao thức
Với ứng dụng
Giao tiếp truyền thông mạng
Đọc/ghi socket (tương tự như đọc ghi file)
NTV 6
WindowsNT
NTV 7
Truyền thông với socket
Quá trình
host or host or
server server
controlled by
app developer
process process
socket socket
TCP with TCP with
buffers, Internet buffers,
variables variables
controlled
by OS
NTV 8
Server: nghe/chờ
Connection request
port
server
Client
NTV 9
Truyền thông: server mở port khác và trao
đổi
tại sao mở port khác
port
server
port
Client
port Connection
NTV 10
Socket descriptor
descriptor table
NTV 11
TCP socket
NTV 12
Sơ đồ TCP server
socket()
Connection
request accept()
connect()
data (request)
write() read()
EOF
close() read()
close()
NTV 13
socket() : Create a socket
#include <sys/socket.h>
int socket (int family, int type, int protocol);
Returns: non-negative descriptor if OK, -1 on error
NTV 14
bind() : Assign an address to a socket
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr *sockaddr, socklen_t addrlen);
NTV 15
listen() : Indicate that the socket will accept
connections
#include <sys/socket.h>
int listen (int sockfd, int backlog);
NTV 16
accept (): Blocks waiting for a connection
#include <sys/socket.h>
int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
NTV 17
Server
accept
Completed
connection queue
Three way
handshake
TCP complete
Incomplete
connection queue
NTV 18
connect(): Establish a connection with a TCP
server
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
NTV 19
Socket I/O: read()
NTV 20
Socket I/O: write()
NTV 21
close(): giải phóng tài nguyên
#include <sys/socket.h>
int close (int sockfd);
NTV 22
TCP Client/Server Example: echo
1. The client reads a line of text from its standard input and
writes the line to the server.
2. The server reads the line from its network input and echoes
the line back to the client.
3. The client reads the echoed line and prints it on its standard
output.
Usage:
%server <listen port>
%client <server’s IP address> <server’s listen port number>
NTV 23
Biến đổi trạng thái
BEGIN/socket()
CLOSED Client Active Open connect()
send SYN
Server Passive Open
bind(),listen(),accept() Close()
NTV 24
TCP Server
socket()
bind()
socket() accept()
connection establishment
connect()
close()
NTV 25
UDP Socket
NTV 26
Sequence
UDP Server
socket()
bind()
UDP Client
recvfrom()
socket()
blocks until datagram
sendto() received from a client
data request
close()
NTV 27
socket() : Create a socket
#include <sys/socket.h>
int socket (int family, int type, int protocol);
Returns: non-negative descriptor if OK, -1 on error
NTV 28
int fd; /* socket descriptor */
NTV 29
bind(): Assign addr & port
NTV 30
sento(): send UDP datagram
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,
const struct sockaddr *to, socklen_t addrlen);
NTV 31
int fd; /* socket descriptor */
struct sockaddr_in srv; /* used by sendto() */
NTV 32
recvfrom(): receive UDP Datagram
#include <sys/socket.h>
NTV 33
int fd; /* socket descriptor */
struct sockaddr_in servaddr; /* used by bind() */
struct sockaddr_in cliaddr; /* used by recvfrom() */
char buf[512]; /* used by recvfrom() */
int cliaddr_len = sizeof(cliaddr); //used by recvfrom()
int nbytes; /* used by recvfrom() */
NTV 34
close(): giải phóng tài nguyên
#include <sys/socket.h>
int close (int sockfd);
NTV 35
Ví dụ
IP
Ethernet Adapter
NTV 36
So sánh UDP và TCP socket
TCP Server
socket()
close()
close() end-of-file notificationread()
close()
NTV 37
Cài đặt
NTV 38
Cài đặt phụ thuộc
HĐH
Ngôn ngữ lập trình hỗ trợ
C, C++: winsock
Java: socket package
Vấn đề cài đặt
Cần xử lý nhiều request đồng thời
NTV 39
TÀI LIỆU THAM KHẢO
Patrice, Bonner - Network Programming with Windows Sockets – Prentice Hall – 1995
Anthony Jones and Jim Ohlund - Network Programming for Microsoft Windows – Microsoft - 1999.
Java Network Programming, 3rd Edition – O Reilly
Jonathan B. Postel - rfc821 (SMTP) Simple Mail Transfer Protocol – Internet - 1982.
David H. Crocker - rfc822 Standard for the format of ARPA Internet text messages – Internet - 1982.
Marshall Rose - rfc1081 (POP3) Post Office Protocol Version 3 – Internet - 1988.
Marshall Rose - rfc1082 Post Office Protocol - Version 3, Extended Service Offerings – Internet – 1988.
Nathaniel S. Borenstein, Ned Freed, Gregory M. Vaudreuil - rfc1521 MIME (Multipurpose Internet Mail
Extensions) Part One – Internet - 1993.
J. Klensin, M. Rose, E. Stefferud, D. Crocker - rfc1651 SMTP Service Extensions – Internet - 1994.
N. Freed, N. Borenstein - rfc2045 - Multipurpose Internet Mail Extensions (MIME) Part One – Internet
– 1996.
Network Programming with Windows Sockets – Prentice Hall
Anthony Jones and Jim Ohlund - Network Programming for Microsoft Windows – Microsoft.
rfc821 - (SMTP) Simple Mail Transfer Protocol.
rfc822 - Standard for the format of ARPA Internet text messages.
rfc1081 - (POP3) Post Office Protocol Version 3.
rfc1082 - Post Office Protocol - Version 3, Extended Service Offerings.
rfc1521 - MIME (Multipurpose Internet Mail Extensions) Part One.
rfc1651 - SMTP Service Extensions.
rfc2045 - Multipurpose Internet Mail Extensions (MIME) Part One.
NTV 40
Địa chỉ IP
IP Addresses are commonly written as strings (“128.2.35.50”), but
programs deal with IP addresses as integers.
Converting strings to numerical address:
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
INADDR_NONE if error
Converting a numerical address to a string:
char *inet_ntoa(struct in_addr inaddr);
NTV 41
Echo server: main
int main(int argc, char **argv) {
int listenfd, connfd; // socket descriptor
int listenport, clientport; // listen port number and client’s port number
struct sockaddr_in cliaddr; // a structure of client’s address
int cliaddrlen; // the size of client’s address structure
char cliaddr_str[INET_ADDRSTRLEN];
NTV 42
Echo Server: Open_listenfd
int Open_listenfd(int port)
{
int listenfd;
struct sockaddr_in servaddr;
NTV 43
Echo client: main
int main(int argc, char **argv)
{
int clientfd, servport;
char *servaddr_str, buf[MAXLINE];
int n;
servaddr_str = argv[1];
servport = atoi(argv[2]);
NTV 44
Echo Client: Open_clientfd
int Open_clientfd(char *servaddr_str, int servport)
{
int clientfd;
struct sockaddr_in servaddr;
NTV 45