Linux--套接字(socket)

套接字

命名socket用于同一主机中不同进程间的通信,网络socket基于TCP/IP协议栈用于不同主机、不同网络间的通信。它们在实现上的主要区别在于网络socket绑定IP地址和端口号,命令socket只需要一个特定的路径就可以进行通信。

Unix域的sockaddr_un结构体

struct sockaddr_un {
 sa_family_t sun_family; /* AF_UNIX */
 char sun_path[UNIX_PATH_MAX]; /* 路径名 */
};

Unix域的套接字不用开放IP端口,更安全。

网络套接字通信的流程:

Linux--套接字(socket)_第1张图片
通常使用的网络套接字测试程序:
client.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define domain AF_INET
#define type SOCK_STREAM
#define protocol 0
#define MSG "i am successed!"
#define CLI_PORT 8848
#define CLI_IP "127.0.0.1"
#define BUFFSIZE 1024
int main(int argc,char *argv)
{
	int cli_fd;
	char buf[BUFFSIZE];
	struct sockaddr_in cli_addr;
	int rd;
	socklen_t len;
	cli_fd=socket(domain,type,protocol);
	if (cli_fd<0)
	{
		perror("create socket failure!:");
		return -1;
	}
	printf("create socket successful!\n");
	memset(&cli_addr,0,sizeof(cli_addr));
	cli_addr.sin_family = domain;
	cli_addr.sin_port = htons(CLI_PORT);
	inet_aton(CLI_IP,&cli_addr.sin_addr);
	printf("ready to connect..........\n");
	if (connect(cli_fd,(struct sockaddr *)&cli_addr,sizeof(cli_addr))<0)
	{
		perror("connect failure!:");
		return -1;
	}
        printf("connect successful!\n");	
	if (write(cli_fd,MSG,strlen(MSG))<0)
	{
		perror("write failure!:");
		goto clean;
	}
	printf("write successful!\n");

	memset(buf,0,sizeof(buf));
	printf("clean data successful!\n");
	rd = read(cli_fd,buf,sizeof(buf));
	printf("read successful!%d\n",rd);
	if (rd<0)
	{
		perror("read fail!:");
		goto clean;
	}
	if (0==rd)
		goto clean;
clean:
	printf("finish sending !!!!\n");
	close(cli_fd);
	return 0;
}

server.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define LISTEN_PORT 8848
#define domain AF_INET
#define type SOCK_STREAM
#define protocol 0
#define BUFFSIZE 1024

int main(int argc,char *argv)
{
	int sever_fd;
	int accept_fd;
	int rd;
	char buf[BUFFSIZE];
	socklen_t len;
	struct sockaddr_in listen_addr;
	sever_fd = socket(domain,type,protocol);
	if (sever_fd < 0)
	{
		perror("create socket fail!:");
		return -1;
	}
	printf("create socket successful!!\n");

	memset(&listen_addr,0,sizeof(listen_addr));
	printf("clean listen_addr successful!\n");
	listen_addr.sin_family = domain;
	listen_addr.sin_port   = htons(LISTEN_PORT);
	listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(sever_fd,(struct sockaddr *)&listen_addr,sizeof(listen_addr))<0)
		{
			perror("bind fail!:");
			return -2;
		}
	printf("bind successful!\n");

	if (listen(sever_fd,1)<0)
	{
		perror("listen fail!:");
		return -3;
	}
	printf("listen successful!!\n");

while(1)
	{
		printf("waitint for receive.........\n");
		accept_fd = accept(sever_fd,(struct sockaddr *)&listen_addr,&len);
		if(accept_fd <0)
		{	
			perror("accept fail!:");
			return -4;
		}
		printf("accept successful !!\n");
		memset(buf,0,sizeof(buf));
		printf("data clean successful!\n");

		rd = read(accept_fd,buf,sizeof(buf));
		if (rd < 0)
		{
			perror("read fail!:");
			return -4;
		}
		if (rd==0)
			goto clean;
		if (write(accept_fd,buf,rd)<0)
		{
			perror("write fail!:");
			goto clean;
		}
		printf("receive message:%s\n",buf);
	}
	
clean:
	close(accept_fd);
	return 0;
}

你可能感兴趣的:(linux)