Kết nối đến quá trình khácint connectint socket, struct sockaddr destaddr, int addrlen; Thông số socket: chỉ ra socket nào cần tạo kết nối socket: chỉ ra socket nào cần tạo kết nố
Trang 1Chương 2
LẬP TRÌNH SOCKET
Trang 3Khai báo socket
u_long S_addr;
} S_un;
};
Trang 4Khai báo địa chỉ socket
Trang 5Khai báo địa chỉ máy
Trang 6Khai báo địa chỉ dịch vụ
Trang 7Khai báo giao thức
Trang 8Network byte order
là sự khác nhau về thứ tự sắp xếp các
byte trong một số interger hoặc
long giữa các hệ điều hành
Trang 9Xử lý địa chỉ IP
Chuyển từ dạng chuỗi A.B.C.D sang
địa chỉ dạng số long
Chuyển từ địa chỉ dạng số long sang
Chuyển từ địa chỉ dạng số long sang
địa chỉ dạng chuỗi A.B.C.D
Trang 10Các hàm socket
Tạo socket
Quản lý kết nối
Gửi nhận dữ liệu
Trang 11Tạo socket
int socket(int af, int type, int protocol);
Tham số
af- họ giao thức, luôn là AF_INET
type – kiểu socket
SOCK_STREAM: TCP socket
SOCK_STREAM: TCP socket
SOCK_DGRAM: UDP socket
protocol – giao thức sẽ dùng với socket, thường
bằng 0
Giá trị trả về
không lỗi: giá trị miêu tả socket
Trang 12Kết nối socket đến port
int bind(int socket, struct sockaddr
localaddr, int addrlen);
Trang 13Kết nối đến quá trình khác
int connect(int socket, struct sockaddr
destaddr, int addrlen);
Thông số
socket: chỉ ra socket nào cần tạo kết nối
socket: chỉ ra socket nào cần tạo kết nối
destaddr: cấu trúc sockaddr với sin_addr và
Trang 14Tạo hàng đợi cho các kết nối đến
int listen(int socket, int
qlength);
Thông số
socket: chỉ ra socket nào cần tạo hàng
socket: chỉ ra socket nào cần tạo hàng
Trang 15Chấp nhận kết nối đến
int newsock=accept(int mainsock, struct
sockaddr *fromaddr, int *addrlen);
Thông số
mainsock: socket đang chờ kết nối
fromaddr: địa chỉ của máy gửi yêu cầu kết nối
fromaddr: địa chỉ của máy gửi yêu cầu kết nối
Trang 16Gửi dữ liệu qua socket
TCP socket
int send(int socket, char* buffer,int
length,int flags);
UDP socket
int sendto(int socket,char* buffer,int
length,int flags, struct sockaddr
desaddr, int addrlen);
Giá trị trả về:
Thành công: số lượng byte dữ liệu thực sự được
gửi
Thất bại: giá trị -1
Trang 17Gửi dữ liệu qua socket
Thông số
buffer: địa chỉ bắt đầu của chuỗi dữ
liệu cần gửi
length: lượng dữ liệu cần gửi
length: lượng dữ liệu cần gửi
flags: các cờ xác định trạng thái gửi
destaddr: địa chỉ (IP,port) của quá trình
nhận
addrlen: độ dài của destaddr
Trang 18receivefrom socket buffer,
int receivefrom(int socket,char* buffer, int
length, int flags,struct sockaddr *fromaddr, int
*addrlen);
Giá trị trả về:
Thành công: số lượng byte dữ liệu thực sự
được nhận
Trang 19Nhận dữ liệu từ socket
Thông số
buffer: địa chỉ bắt đầu của chuỗi dữ liệu
cần nhận
length: lượng dữ liệu lớn nhất có thể
length: lượng dữ liệu lớn nhất có thể
nhận
flags: các cờ xác định trạng thái nhận
fromaddr: địa chỉ (IP,port) của quá trình
nhận
Trang 20Các hàm hỗ trợ (1)
Lấy tên của máy cục bộ
int gethostname(char *name,int *namelen)
Trả về SOCK_ERROR nếu thất bại
Định tên cho máy cục bộ
Định tên cho máy cục bộ
int sethostname(char *name,int namelen)
Trả về SOCK_ERROR nếu thất bại
Lấy tên miền cục bộ
int getdomainname(char *name,int namelen)
Trả về SOCK_ERROR nếu thất bại
Trang 21Các hàm hỗ trợ (2)
Định tên cho miền cục bộ
int setdomainname(char *name,int
namelen)
Trả về SOCK_ERROR nếu thất bại
Trả về SOCK_ERROR nếu thất bại
Lấy thông tin của máy đang kết nối
int getpeername(int socket,struct
sockaddr *name,int* namelen)
Trả về SOCK_ERROR nếu thất bại
Trang 22Các hàm hỗ trợ (3)
Lấy giá trị một option của socket
int getsockopt(int socket, int level,
int optname, char *optval, int
*optlen) Trả về SOCK_ERROR nếu thất bại
Trả về SOCK_ERROR nếu thất bại
Định giá trị của một option của socket
int setsockopt(int socket, int level,
int optname, char *optval, int
*optlen)
Trang 23Các hàm hỗ trợ (4)
Lấy thông tin máy từ tên máy
struct hostent *gethostbyname(char
*name);
Trả về NULL nếu thất bại
Trả về NULL nếu thất bại
Lấy thông tin máy từ địa chỉ máy
struct hostent *gethostbyaddr(char
*addr,int len, int type);
Trả về NULL nếu thất bại
Trang 24Các hàm hỗ trợ (5)
Lấy thông tin về dịch vụ bằng tên
struct servent *getservbyname(char
*name, char *proto);
Trả về NULL nếu thất bại
Trả về NULL nếu thất bại
Lấy thông tin về dịch vụ bằng cổng
struct servent *getservbyport(int
port, char *proto);
Trả về NULL nếu thất bại
Trang 25Các hàm hỗ trợ (6)
Lấy thông tin về giao thức bằng tên
struct protoent *getprotobyname(char
*name);
Trả về NULL nếu thất bại
Trả về NULL nếu thất bại
Lấy thông tin về giao thức bằng số
struct protoent *getprotobynumber(int
number);
Trả về NULL nếu thất bại
Trang 26Một số lưu ý
Kiểm tra kết quả gọi hàm:
Do môi trường mạng là một môi trường
biến động và tỉ lệ sai cao nên cần luôn kiểm tra kết quả thực hiện các hàm
kiểm tra kết quả thực hiện các hàm
Thực hiện đúng thứ tự gọi hàm
Trang 27Mô hình UDP
data
Trang 28Mô hình UDP
sendto()
receivefrom()
sendto()
receivefrom() data
Trang 29send()/receive() send()/receive()
accept() connection request
data
listen()
new socket
Trang 30send()/receive() send()/receive()
accept() connection request
data
listen()
close()
(main socket) new socket
NEW
Trang 31Ví dụ - Server.c (1)
/* A simple server in the internet domain using TCP
The port number is passed as an argument */
Trang 34Server.c (4)
…
if (bind(sockfd, (struct sockaddr *)
&serv_addr,sizeof(serv_addr)) < 0) error("ERROR on binding");
Trang 35error("ERROR reading from socket");
printf("Here is the message:%s\n",buffer);
n = write(newsockfd,"I got your
message",18);
if (n < 0)
error("ERROR writing to socket");
close(sockfd);close(newsockfd);
Trang 37Client.c (2)
…
int main(int argc, char *argv[]) {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
Trang 39Client.c (3)
…
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char
bcopy((char *)server->h_addr, (char
*)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,&serv_addr,sizeof(serv_addr)) <
0)
Trang 42Server_UDP.c (1)
/* Creates a datagram server The port
number is passed as an argument This
server runs forever */
Trang 43Server_UDP.c (2)
…
int main(int argc, char *argv[])
{
int sock, length, fromlen, n;
struct sockaddr_in server;
struct sockaddr_in from;
struct sockaddr_in from;
Trang 44…
Trang 47Client_UDP.c (2)
…
int main(int argc, char *argv[])
{
int sock, length, n;
struct sockaddr_in server, from;
Trang 49Client_UDP.c (3)
…
bcopy((char *)hp->h_addr,
(char *)&server.sin_addr, hp->h_length);
hp->h_length);
server.sin_port = htons(atoi(argv[2]));
length=sizeof(struct sockaddr_in);
Trang 50if (n < 0) error("Sendto");
…