Linux C网络编程之Socket套接字

来源:互联网 发布:js 判断浏览器版本号 编辑:程序博客网 时间:2024/05/21 22:56

套接字类型分为3种:流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM)和原始套接字。


流式套接字:提供可靠的,面向连接的通信流,并且,用流式套接字发送的数据顺序是1, 2, 3 ……的话,接收端接收到的数据也是 1, 2, 3……。

 

简言之:TCP连接方式

 

数据包协议:无连接的, 数据独立,无序且不保证数据传输的可靠性。

 

简言之:UDP连接方式

 

流式套接字服务端工作流程:


socket()创建套接字--->bind()套接字名字--->listen()创建套接字队列--->accept()接收连接--->read()读取客户端信息--->write()回复客户端信息--->close()关闭客户端socket连接

 

socket(int domain, int type, int protocol)

 

domain:地址族


domain的取值范围如下表,大多数情况下会使用AF_UNIX  /  AF_INET:

 

 

参数说明AF_UNIXUNIX内部(文件系统套接字)AF_INETARPA因特网协议(UNIX网络套接字)AF_ISOISO标准协议AF_NSAF_IPXNOVELL IPX协议AF_APPLETALKAppletalk DDS

 

type:套接字对应的通信类型(SOCK_STREAM   /   SOCK_DGRAM)


protocol:协议,参数默认值0,根据套接字类型和域决定。如SOCK_STREAM 对应 0。

 

 

套接字地址:


这里介绍AF_UNIX和AF_INET的套接字地址


AF_UNIX是包含在sys/un.h头文件中的sockaddr_un结构,该结构定义为:

 

struct sockaddr_un {


       sa_family_t sun_family;     //是一个short类型

  

       char sun_path[];    //路径长度有限:不能超过108个字符


}

 

AF_INET是包含在netinet/in.h中的sockaddr_in结构,该结构为:

 

struct sockaddr_in {


        short int sin_family;     //AF_INET


        unsigned short int sin_port;  //端口号


        struct in_addr sin_addr;    //Internet地址


}

 

套接字的名字(bind())


int bind(int socket, const struct sockaddr *address, size_t address_len);


成功返回0,否则返回-1,并有errno变量

 


创建套接字队列  listen()


int listen(int socket, int backlog);

 

backlog设置连接的个数,套接字上排列的接入连接个数最多不能超过这个数字。常用值为5.


成功返回0,否则返回-1.

 

 

接收连接 accept()

 

int accept( int socket, struct sockaddr *address, size_t   *address_len);

 

请求连接 connect()

 

int connect(int socket, const struct sockaddr *address, size_t address_len);

 

read():读取数据


write():写入/返回数据

 

关闭连接 close(socket 标识符)


服务器端代码:

 

客户端代码:

原创粉丝点击