本地套接字例子


Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解

https://blog.csdn.net/gladyoucame/article/details/8768731

server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define UNIX_DOMAIN "UNIX.domain"

int main(void)
{
	int lsn_fd, apt_fd;
	struct sockaddr_un srv_addr;
	struct sockaddr_un clt_addr;
	socklen_t clt_len;
	int ret;
	int i;
	char recv_buf[1024];
	char send_buf[1024];

	//1.create socket to bind local IP and PORT
	lsn_fd = socket(PF_UNIX, SOCK_STREAM, 0);
//网络套接字创建
// lsn_fd = socket(AF_INET, SOCK_STREAM, 0);
	if(lsn_fd < 0)
	{
		perror("can't create communication socket!");
		return 1;
	}

	//2.create local IP and PORT
	srv_addr.sun_family = AF_UNIX;
	strncpy(srv_addr.sun_path, UNIX_DOMAIN, sizeof(srv_addr.sun_path) - 1);
//每次创建前删除以前创建的socket
	unlink(UNIX_DOMAIN);

	//3.bind sockfd and sockaddr
    //在此文件夹下穿件了socket文件
	ret = bind(lsn_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
	
  if(ret == -1)
	{
		perror("can't bind local sockaddr!");
		close(lsn_fd);
		unlink(UNIX_DOMAIN);
		return 1;
	}
    system("ls -al |grep '^s'");
	//4.listen lsn_fd, try listen 1
	ret = listen(lsn_fd, 1);
	if(ret == -1)
	{
		perror("can't listen client connect request");
		close(lsn_fd);
		unlink(UNIX_DOMAIN);
		return 1;
	}

	clt_len = sizeof(clt_addr);
	while(1)
	{
		apt_fd = accept(lsn_fd, (struct sockaddr*)&clt_addr, &clt_len);
		if(apt_fd < 0)
		{
			perror("can't listen client connect request");
			close(lsn_fd);
			unlink(UNIX_DOMAIN);
			return 1; 
		}

		printf("received a connection\n");
		printf("send message to client\n");
		memset(send_buf, 0, 1024);
		strcpy(send_buf, "Hello, you have connected to server succeed");

		int snd_num = write(apt_fd, send_buf, 1024);
		if(snd_num != 1024)
		{
			perror("send messge to client failed\n");
			close(apt_fd);
			close(lsn_fd);
			unlink(UNIX_DOMAIN);
			return 1;
		}
		//read and printf client info
		printf("============info=================\n");
		for(i = 0; i < 4; i++)
		{
			memset(recv_buf, 0, 1024);
			int rcv_num = read(apt_fd, recv_buf, sizeof(recv_buf));
      if (rcv_num == 0) {
        printf("client close\n");
        break;
      } else {
			    printf("Message from client (%d) :%s\n", rcv_num, recv_buf);
      }
		}
	}
	close(apt_fd);
	close(lsn_fd);
	//unlink(UNIX_DOMAIN);
	return 0;
}
client

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define UNIX_DOMAIN "UNIX.domain"

int main(void)
{
	int connect_fd;
	struct sockaddr_un srv_addr;
	char snd_buf[1024];
	char rcv_buf[1024];
	int ret;
	int i;

	//1.create client socket
	connect_fd = socket(PF_UNIX, SOCK_STREAM, 0);
	if(connect_fd < 0)
	{
		perror("client create socket failed");
		return 1;
	}

	//2.set server sockaddr_un
	srv_addr.sun_family = AF_UNIX;
	strcpy(srv_addr.sun_path, UNIX_DOMAIN);

	//3.connect to server
	ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
	if(ret == -1)
	{
		perror("connect to server failed!");
		close(connect_fd);
		unlink(UNIX_DOMAIN);
		return 1;
	}

	//receive message from server
	memset(rcv_buf, 0, 1024);
	int rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf));
	printf("receive message from server (%d) :%s\n", rcv_num, rcv_buf);
	//printf("\n");

	//send message to server
	memset(snd_buf, 0, 1024);
	strcpy(snd_buf, "message from client");
	printf("sizeof(snd_buf): %d\n", sizeof(snd_buf));
	sleep(3);

	//send message to server
	for(i = 0; i < 4; i++)
	{
		write(connect_fd, snd_buf, sizeof(snd_buf));
	}
	close(connect_fd);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值