1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Chương 2: Lập trình Soket pptx

51 339 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Socket
Thể loại Giáo trình
Định dạng
Số trang 51
Dung lượng 500,45 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

Chương 2

LẬP TRÌNH SOCKET

Trang 3

Khai báo socket

u_long S_addr;

} S_un;

};

Trang 4

Khai báo địa chỉ socket

Trang 5

Khai báo địa chỉ máy

Trang 6

Khai báo địa chỉ dịch vụ

Trang 7

Khai báo giao thức

Trang 8

Network 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 9

Xử 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 10

Các hàm socket

 Tạo socket

 Quản lý kết nối

 Gửi nhận dữ liệu

Trang 11

Tạ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 12

Kết nối socket đến port

int bind(int socket, struct sockaddr

localaddr, int addrlen);

Trang 13

Kế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 14

Tạ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 15

Chấ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 16

Gử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 17

Gử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 18

receivefrom 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 19

Nhậ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 20

Cá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 21

Cá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 22

Cá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 23

Cá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 24

Cá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 25

Cá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 26

Mộ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 27

Mô hình UDP

data

Trang 28

Mô hình UDP

sendto()

receivefrom()

sendto()

receivefrom() data

Trang 29

send()/receive() send()/receive()

accept() connection request

data

listen()

new socket

Trang 30

send()/receive() send()/receive()

accept() connection request

data

listen()

close()

(main socket) new socket

NEW

Trang 31

Ví dụ - Server.c (1)

/* A simple server in the internet domain using TCP

The port number is passed as an argument */

Trang 34

Server.c (4)

if (bind(sockfd, (struct sockaddr *)

&serv_addr,sizeof(serv_addr)) < 0) error("ERROR on binding");

Trang 35

error("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 37

Client.c (2)

int main(int argc, char *argv[]) {

int sockfd, portno, n;

struct sockaddr_in serv_addr;

struct hostent *server;

Trang 39

Client.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 42

Server_UDP.c (1)

/* Creates a datagram server The port

number is passed as an argument This

server runs forever */

Trang 43

Server_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 47

Client_UDP.c (2)

int main(int argc, char *argv[])

{

int sock, length, n;

struct sockaddr_in server, from;

Trang 49

Client_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 50

if (n < 0) error("Sendto");

Ngày đăng: 26/01/2014, 17:20

TỪ KHÓA LIÊN QUAN

w