示例#1
0
文件: c.c 项目: saitej3/CN
int main()
{
	int sfd,sfd1;
	struct sockaddr_un serv_addr,client_addr;
	struct sockaddr_un serv_addrs;

	int len=sizeof(client_addr);

	serv_addr.sun_family=AF_UNIX;
	strcpy(serv_addr.sun_path,"echo_socket_c");

	serv_addrs.sun_family=AF_UNIX;
	strcpy(serv_addrs.sun_path,"echo_socket_cs");

	sfd1=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd1,"socket error");
	error_func(connect(sfd1,(struct sockaddr*)&serv_addrs,sizeof(serv_addrs)),"connect error");
	send(sfd1,"From server c to server s",30,0);
	
	sfd=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd,"socket error");
	unlink(serv_addr.sun_path);

	error_func(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"bind error");
	error_func(listen(sfd,5),"listen error");
	
	char buffer[30];
	int nfd=accept(sfd,(struct sockaddr*)&client_addr,&len);
	error_func(nfd,"accept error");
	recv(nfd,buffer,sizeof(buffer),0);
	printf("%s\n",buffer);

	int clients_no=0;
	while(1)
	{
		int fd=recv_file_descriptor(nfd);
		printf("File descriptor%d\n",fd);
		if(clients_no>=max_clients)
		{
			printf("%s\n","max reached of server c");
			send_file_descriptor(sfd1,fd);
		}
		else
			pthread_create(&threads[clients_no++],NULL,func,(void *)(&fd));
	}


}
示例#2
0
文件: fd-passing.c 项目: nminoru/misc
static int
do_client(void)
{
    int sockfd;

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_un saddr = {0};
    saddr.sun_family = AF_UNIX;

    strcpy(saddr.sun_path, UNIX_DOMAIN_PATH);

    if (connect(sockfd, (struct sockaddr*) &saddr, sizeof(struct sockaddr_un)) == -1) {
        perror("connect");
        goto error;
    }

    setnonblocking(sockfd);

    int shmfd;

    while ((shmfd = recv_file_descriptor(sockfd)) == -1) {
        if (errno != EAGAIN) {
            perror("recv_file_descriptor");
            exit(EXIT_FAILURE);
        }
    }

    close(sockfd);

    return shmfd;

error:
    close(sockfd);
    exit(EXIT_FAILURE);

    return -1;
}
int get_magic_socket(char* host, char* port)
{
  struct sockaddr_un addr;
  int fd;

  printf("Get socket to %s:%s\n", host, port);

  if ((fd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0)
  {
    perror("Failed to create client socket");
    return fd;
  }

  memset(&addr, 0, sizeof(addr));

  addr.sun_family = AF_LOCAL;
  strcpy(addr.sun_path, SOCKET_PATH);

  if (connect(fd,
              (struct sockaddr *) &(addr),
              sizeof(addr)) < 0) {
    perror("Failed to connect to server\n");
    return -1;
  }

  char target[1024];
  sprintf(target, "%s:%s", host, port);

  if (send(fd, target, strlen(target), 0) < 0)
  {
    fprintf(stderr, "Error sending target '%s' to server: %s", target, strerror(errno));
    return -2;
  }

  int magic_sock = recv_file_descriptor(fd);

  return magic_sock;
}
示例#4
0
文件: server1.c 项目: saitej3/CN
int main()
{
    int pid=0;
    pid=fork();

    if(pid==0)
    {
        sleep(5);
        printf("%s\n","child process");
        int sfd;
        struct sockaddr_un serv_addr;
        serv_addr.sun_family=AF_UNIX;
        strcpy(serv_addr.sun_path,"echo_socket");

        sfd=socket(AF_UNIX,SOCK_STREAM,0);
        error_func(sfd,"socket error");
        error_func(connect(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"connect error");
        int fd=recv_file_descriptor(sfd);
        printf("fd is child: %d\n",fd);
        char buffer[30];
        int nbytes;
        while(1)
        {
            scanf("parent bytes?%d",&nbytes);
            read(fd,buffer,nbytes);
            printf("child :%s\n",buffer);
            sleep(3);
        }
        send(sfd,"From client to server",30,0);
        recv(sfd,buffer,sizeof(buffer),0);
        printf("%s\n",buffer);
        close(sfd);
    }
    else
    {
        printf("%s\n","parent process");
        const char *filename = "sample.txt";
        int fd = open(filename, O_RDWR);

        printf("fd parent:%d\n",fd);
        int sfd;
        struct sockaddr_un serv_addr,client_addr;
        int len=sizeof(client_addr);
        serv_addr.sun_family=AF_UNIX;
        strcpy(serv_addr.sun_path,"echo_socket");
        sfd=socket(AF_UNIX,SOCK_STREAM,0);
        error_func(sfd,"socket error");
        unlink(serv_addr.sun_path);
        error_func(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"bind error");
        error_func(listen(sfd,5),"listen error");

        int nfd=accept(sfd,(struct sockaddr*)&client_addr,&len);
        error_func(nfd,"accept error");
        send_file_descriptor(nfd,fd);

        int nbytes;
        char buffer1[30];
        while(1)
        {
            scanf("parent bytes?%d",&nbytes);
            read(fd,buffer1,nbytes);
            printf("parent :%s\n",buffer1);
            sleep(3);
        }
        char buffer[30];
        recv(nfd,buffer,sizeof(buffer),0);
        printf("%s\n",buffer);
        send(nfd,"hello from server",30,0);
        wait(NULL);
        close(nfd);
        close(sfd);
    }
}
示例#5
0
文件: s.c 项目: saitej3/CN
int main()
{
	int sfd,sfdcs,sfd1;
	struct sockaddr_un serv_addr,client_addr;
	struct sockaddr_un serv_addrcs,client_addres; //address of server1
	struct sockaddr_un serv_addrs;

	int lencs=sizeof(client_addres);
	int len=sizeof(client_addr);

	serv_addr.sun_family=AF_UNIX;
	strcpy(serv_addr.sun_path,"echo_socket_s");

	serv_addrs.sun_family=AF_UNIX;
	strcpy(serv_addrs.sun_path,"echo_socket_se");

	serv_addrcs.sun_family=AF_UNIX;
	strcpy(serv_addrcs.sun_path,"echo_socket_cs");

	sfdcs=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfdcs,"socket error");

	sfd1=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd1,"socket error");
	error_func(connect(sfd1,(struct sockaddr*)&serv_addrs,sizeof(serv_addrs)),"connect error");
	send(sfd1,"From server s to server e",30,0);
	
	sfd=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd,"socket error");
	unlink(serv_addr.sun_path);
	unlink(serv_addrcs.sun_path);

	error_func(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"bind error");
	error_func(listen(sfd,5),"listen error");
	error_func(bind(sfdcs,(struct sockaddr*)&serv_addrcs,sizeof(serv_addrcs)),"bind error");
	error_func(listen(sfdcs,5),"listen error");

	int nfdcs=accept(sfdcs,(struct sockaddr*)&client_addres,&lencs);
	error_func(nfdcs,"accept error");
	char buffer[30];
	recv(nfdcs,buffer,sizeof(buffer),0);
	printf("%s\n",buffer);

	int nfd=accept(sfd,(struct sockaddr*)&client_addr,&len);
	error_func(nfd,"accept error");
	recv(nfd,buffer,sizeof(buffer),0);
	printf("%s\n",buffer);

	struct pollfd fdp[2];

	fdp[0].fd=nfd;
	fdp[0].events=POLLRDNORM;

	fdp[1].fd=nfdcs;
	fdp[1].events=POLLRDNORM;

	int clients_no=0;
	while(1)
	{
		error_func(poll(fdp,2,0),"poll error");

		if(fdp[0].events & fdp[0].revents)
		{
			printf("%s\n","0 main selected");
			int fd=recv_file_descriptor(nfd);
			printf("File descriptor%d\n",fd);
			if(clients_no >=max_clients)
			{
				//send clients to e server
				printf("%s\n","max of s reached sending to e server");
				send_file_descriptor(sfd1,fd);
				perror("send:");
			}
			else
				pthread_create(&threads[clients_no++],NULL,func,(void *)(&fd));
		}

		else if(fdp[1].events & fdp[1].revents)
		{
			printf("%s\n","1 s server selected");
			int fd=recv_file_descriptor(nfdcs);
			printf("File descriptor%d\n",fd);
			if(clients_no>=max_clients)
			{
				//send clients to e server
				printf("%s\n","max of s reached sending to e server");
				send_file_descriptor(sfd1,fd);
				perror("send:");
			}
			else
				pthread_create(&threads[clients_no++],NULL,func,(void *)(&fd));
		}
		else
			continue;
	}


}