Linux 进程间通讯(IPC)详细总结 6本地套接字。

来源:互联网 发布:无限极网络机顶盒 编辑:程序博客网 时间:2024/05/17 07:56

6本地套接字

   1)套接字可用于一个进程和其他进程互通信息.即可以实现本地计算机通信,也可以用于网络通信.

2)套接字不同与管道,即它们是双向通信.

3)创建通用套接字的系统调用是socket函数,该函数创建的套接字可以用于本地或网络连接.

套接字定义:

需要的头文件:

#include<sys/types.h>

#include<sys/socket.h>

#include<sys/un.h>

#include<stdio.h>

#include<unistd.h>

对于本地套接字来说,流式套接字(SOCK_STREAM)是一个有顺序的、可靠的双向字节流,相当于在本地进程之间建立起一条数据通道;数据报式套接字(SOCK_DGRAM)相当于单纯的发送消息,在进程通信过程中,理论上可能会有信息丢失、复制或者不按先后次序到达的情况,但由于其在本地通信,不通过外界网络,这些情况出现的概率很小。


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

其中,domain参数指定协议族,对于本地套接字来说,其值须被置为AF_UNIX枚举值;type参数指定套接字类型,protocol参数指定具体协议;type参数可被设置为SOCK_STREAM(流式套接字)或SOCK_DGRAM(数据报式套接字),protocol字段应被设置为0;其返回值为生成的套接字描述符。

如果本地套接字使用SOCK_DGRAM方式,那么和消息队列的特性类似,数据包不会丢失也不会乱。

2,SOCK_STREAM流式本地套接字的通信双方均需要具有本地地址,其中服务器端的本地地址需要明确指定,指定方法是使用struct sockaddr_un类型的变量,将相应字段赋值,再将其绑定在创建的服务器套接字上,绑定要使用bind系统调用,其原形如下:

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

3,其中socket表示服务器端的套接字描述符,address表示需要绑定的本地地址,是一个struct sockaddr_un类型的变量,address_len表示该本地地址的字节长度。实现服务器端地址指定功能的代码如下(假设服务器端已经通过上文所述的socket系统调用创建了套接字,server_sockfd为其套接字描述符):

struct sockaddr_un server_address;

server_address.sun_family = AF_UNIX;

strcpy(server_address.sun_path, "Server Socket");

bind(server_sockfd, (struct sockaddr*)&server_address, sizeof(server_address));

4,服务器端套接字创建完毕并赋予本地地址值(名称,本例中为Server Socket)后,需要进行监听,等待客户端连接并处理请求,监听使用listen系统调用,接受客户端连接使用accept系统调用,它们的原形如下:

int listen(int socket, int backlog);

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

其中socket表示服务器端的套接字描述符;backlog表示排队连接队列的长度(若有多个客户端同时连接,则需要进行排队);address表示当前连接客户端的本地地址,该参数为输出参数,是客户端传递过来的关于自身的信息;address_len表示当前连接客户端本地地址的字节长度,这个参数既是输入参数,又是输出参数。

#define MAX_CONNECTION_NUMBER 10

int server_client_length, server_client_sockfd;

struct sockaddr_un server_client_address;

listen(server_sockfd, MAX_CONNECTION_NUMBER);

while(1)

{

    // ......(some process code)

    server_client_length = sizeof(server_client_address);

    server_client_sockfd =accept(server_sockfd, (struct sockaddr*)&server_client_address,&server_client_length);

    // ......(some process code)

}

这里使用死循环的原因是服务器是一个不断提供服务的实体,它需要不间断的进行监听、接受并处理连接,本例中,每个连接只能进行串行处理,即一个连接处理完后,才能进行后续连接的处理。


原创粉丝点击