UNIX 域套接字——UNIX domain socket

/*********************程序相关信息*********************
 * 程序编号:015
 * 程序编写起始日期:2013.11.30
 * 程序编写完成日期:2013.11.30
 * 程序修改日期:                                    修改备注:
 * 程序目的:学习UNIX域套接字
 * 所用主要函数:socket() bind() accept() listen()
 * 程序说明: 同一台机器不同进程间通信。
 * 程序完成地点: 
 * *********************程序相关信息*********************/


#define UNIX_PATH_MAX    108

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <stdio.h>

#define BUFSIZE 32

int main(void)
{
	int sd, newsd;
	char buf[BUFSIZE];
	struct sockaddr_un myend,*p;
	int ret;

	sd = socket(PF_LOCAL, SOCK_STREAM, 0);
	if (sd == -1) {
		perror("socket()");
		goto socket_err;
	}
//  #define UNIX_PATH_MAX    108
//
//  struct sockaddr_un {
//		sa_family_t    sun_family;               /* AF_UNIX */
//		char           sun_path[UNIX_PATH_MAX];  /* pathname*/
//	};
//
	myend.sun_family = AF_UNIX;
	//int snprintf(char *str, size_t size, const char *format);
	snprintf(myend.sun_path, UNIX_PATH_MAX, "rcv_sock");
//	fprintf("rcv_sock","%s",myend.sun_path); //wrong

	unlink(myend.sun_path);
// Call the unlink function to remove the specified FILE
	ret = bind(sd, (struct  sockaddr *)&myend, sizeof(myend));
	if (ret == -1) {
		perror("bind()");
		goto bind_err;
	}
//调用 listen 使其能够自动接收到来的连接并且为连接队列指定一个长度限制
	listen(sd, 20);

	newsd = accept(sd, NULL, 0);
	if (newsd == -1) {
		perror("accept()");
		goto accept_err;
	}

	while (1) {
		ret = read(newsd, buf, BUFSIZE);
		/* if error */
		if (ret == 0) {
			break;
		}

		write(1, buf, ret);
		write(newsd, "xxxxx\n", 6);
	}

	close(newsd);
	close(sd);

	return 0;



	close(newsd);
accept_err:
bind_err:
	close(sd);
socket_err:
	return 1;
}

 
/*********************程序相关信息*********************
 * 程序编号:015
 * 程序编写起始日期:2013.11.30
 * 程序编写完成日期:2013.11.30
 * 程序修改日期:                                    修改备注:
 * 程序目的:学习unix 
 * 所用主要函数:pipe(),read(),fork()
 * 程序说明:在本机上运行时,可以把程序中的“./test.c”修改成自己机器上的某个文件(要带路径)
 * 程序完成地点: 
 * *********************程序相关信息*********************/


#define UNIX_PATH_MAX    108

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <stdio.h>

#define BUFSIZE 32

int main(void)
{
	int sd;
	char buf[BUFSIZE];
	struct sockaddr_un hisend;
	int ret;

	sd = socket(PF_LOCAL, SOCK_STREAM, 0);
	if (sd == -1) {
		perror("socket()");
		goto socket_err;
	}

	hisend.sun_family = AF_UNIX;
	snprintf(hisend.sun_path, UNIX_PATH_MAX, "rcv_sock");

	ret = connect(sd, (struct  sockaddr *)&hisend, sizeof(hisend));
	if (ret == -1) {
		perror("connect()");
		goto connect_err;
	}

	while (1) {
		ret = read(0, buf, BUFSIZE);
		/* if error */
		if (ret == 0) {
			break;
		}

		write(sd, buf, ret);
		ret = read(sd, buf, BUFSIZE);
		write(1, buf, ret);
	}

	close(sd);

	return 0;



accept_err:
connect_err:
	close(sd);
socket_err:
	return 1;
}

你可能感兴趣的:(socket)