您的位置:首页 > 编程语言

UNIX的socket编程和通用编程框架图

2017-01-10 22:36 106 查看
socekt编程接口中两个重要的结构:

注意!:struct sockaddr数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用与struct sockaddr等价的数据struct sockaddr_in进行操作.

他们在netinet/in.h中定义

struct sockaddr_in

{

u_short sin_family; // 地址族, AF_INET,2 bytes

u_short sin_port; // 端口,2 bytes

struct in_addr sin_addr; // IPV4地址,4 bytes

char sin_zero[8]; // 8 bytes unused,作为填充

};

struct in_addr
{
in_addr_t  s_addr;            // u32 network address
};


struct sockaddr
{
unsigned short sa_family;/*addressfamily,AF_xxx*/
char sa_data[14];/*14bytesofprotocoladdress*/
};


编程框架:



包含头文件:

#include

int socket (int domain, int type, int protocol);


功能

创建套接字

参数

int domain协议类型 //AF_INET

type 套接字的类型

SOCK_STREAM // 流式套接字 tcp

SOCK_DGRAM // 数据报套接字 udp

SOCK_RAW // 原始套接字

int protocol 0

返回值

返回一个套接字描述符 or -1

int bind()函数:

int bind(int sockfd, struct sockaddr *my_addr, int addrlen) ;


功能

pid + ip +port 绑定

参数

int sockfd socket返回的

struct sockaddr *my_addr 我们要填充的sockaddr_in 结构体

int addrlen sockaddr_in size

返回值 0 or -1

使用例举:

struct sockaddr_in   my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port  = htons (6666);
my_addr.sin_addr.s_addr = inet_addr(“192.168.1.100”);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in )  );


int listen()函数:

int listen (int sockfd, int backlog);


功能

监听客户端的连接 tcp服务器专用

调用完之后,这个套接字,就变成了监听套接字

参数

int sockfd

int backlog //请求列队中最大的请求数,大多系统默认为5

int accept()函数:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) ;


功能

阻塞

接收一个客户端的连接,创建一个新的套接字返回

调用完了之后,客户端和服务器端就 可以通信了

tcp服务器专用的套接字

参数

int sockfd

struct sockaddr *addr 客户端的ip+port

socklen_t *addrlen 指针

返回值

新的套接字,这个套接字才是真正和客户端通信用的套接字

int connect()函数

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);


功能

客户端使用,

和服务器连接【tcp】 指定一个发送对象【udp】

阻塞,一旦返回,说明建立成功了,就可以和服务器端通信了

事实上发起了一次tcp3次握手

参数

int sockfd

struct sockaddr *serv_addr 服务器的ip+port

客户端的端口号由系统自动分配

int addrlen

返回值

send()和recv()用法和write()和read()一样的

close()也是可用的;

int shutdown()函数:

int shutdown(int sockfd, int howto);


howto

0 关闭读通道

1 关系写通道

2 关闭双向通道
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息