UNIX本地套接字 示例

server.c:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>


#if 0
#define SOCK_UNIX_FILE "/tmp/video1_sock"
#else
#define SOCK_UNIX_FILE "/tmp/video_sock"
#endif
#define MAX_TRANSMIT_DATA_LEN 10240
#define S_TIME_OUT 2000 //2s

int tcp_write(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
	int ret;
	int total_lenth = 0;
	int len_remain = len;
	char *write_position = buf;
	struct timeval timeout;
	fd_set  wset, eset;
	int status = 1;

	timeout.tv_sec =timeout_ms/1000;
	timeout.tv_usec = timeout_ms%1000;
		printf("%s  %d \n",__func__,__LINE__);
	while(1){
		
		FD_ZERO(&wset);
		FD_ZERO(&eset);
		FD_SET(socketfd, &eset);
		FD_SET(socketfd, &wset);	
		ret = select(socketfd+1, NULL, &wset, &eset, &timeout);
		printf("%s  %d \n",__func__,__LINE__);
		if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
			//timeout
			printf(" write timeout \n");
			break;
		}
		printf("%s  %d \n",__func__,__LINE__);
		if(FD_ISSET(socketfd, &wset)){
		printf("%s  %d \n",__func__,__LINE__);
			ret = send(socketfd, write_position, len_remain, 0);
			printf("%s  %d \n",__func__,__LINE__);
			if(ret < 0){
				printf(" write err \n");
				return -1;
			}

			if(ret == 0){
				printf(" write ==0 ... \n");

			}
		printf("%s  %d \n",__func__,__LINE__);
			write_position += ret;
			total_lenth += ret;
			len_remain -= ret;
			if(0 == len_remain) {
				break;
			}
			
		}

		if(FD_ISSET(socketfd, &eset)){
			printf("write err \n");
			break;

		}


	}

	//printf("write %d \n",len -len_remain);
	return len -len_remain ;	
}


int tcp_read(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
	int ret;
	int total_lenth = 0;
	int len_remain = len;
	char *read_position = buf;
	struct timeval timeout;
	fd_set  rset, eset;

	timeout.tv_sec =timeout_ms/1000;
	timeout.tv_usec = timeout_ms%1000;
	//printf("read timeout set %d %d\n",timeout.tv_sec,timeout.tv_usec);

		
	while(1){
		
		FD_ZERO(&rset);
		FD_ZERO(&eset);
		FD_SET(socketfd, &eset);
		FD_SET(socketfd, &rset);	

		
		ret = select(socketfd+1, &rset, NULL, &eset, &timeout);
		
		if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
			//timeout
			//printf(" read timeout \n");
			break;
		}

		if(FD_ISSET(socketfd, &rset)){
			ret = recv(socketfd, read_position, len_remain, 0);
			if(ret < 0){
				//error
				//printf("read err\n");
				break;
			}
			if(ret == 0){
				//printf(" read %d..\n",ret);
				// peer close
				//printf(" peer close ?\n");
				break;
			}
				//printf(" read %d...\n",ret);
			
			read_position += ret;
			total_lenth += ret;
			len_remain -= ret;
			if(len_remain <=0) break;
			
		}

		if(FD_ISSET(socketfd, &eset)){
			printf("read err \n");
			break;

		}

	}
	//printf("time remain %d %d\n",timeout.tv_sec,timeout.tv_usec);
	return total_lenth;	
}


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>

int peer_sock_status = 0;
static void sig_handle(int signo)
{
	switch(signo)
	{

	case SIGTERM:
		printf("receive SIGTERM!\n");
		exit(0);
		break;
	case SIGKILL:
		printf("receive SIGKILL!\n");
		exit(0);
		break;			
	case SIGINT:
		printf("\nreceive Ctrl+c!Then, the server will exit after 3 seconds !\n");
		sleep(3);
		exit(0);
		break;
	case SIGALRM:
		printf("receive SIGALRM!\n");
		break;
	case SIGILL:
		printf("receive SIGILL!\n");
		break;
	case SIGSEGV:
			printf("receive SIGSEGV!\n");
		break;
	case SIGPIPE:
			peer_sock_status = 0;
			printf("receive SIGPIPE!\n");
			break;
	default:
		printf("receive unknown signal(%d)!\n", signo);
		break;
	}
}

int main (int argc, char *argv[])
{
        int server_sockfd, client_sockfd;
        int server_len, client_len;
        static int i_tmp = 0;
        struct sockaddr_un server_address;     
        struct sockaddr_un client_address;
        int i, bytes;
        char ch_send, ch_recv;
				char s_buf[MAX_TRANSMIT_DATA_LEN];
				char r_buf[8];
				unsigned int len = 0;
        unlink (SOCK_UNIX_FILE);//delete the file link for the function of bind   

       
        server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);

       
        server_address.sun_family = AF_UNIX;

       
        strcpy (server_address.sun_path, SOCK_UNIX_FILE);

       
        server_len = sizeof (server_address);

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

       
        listen (server_sockfd, 5);//the num of the client is five

        printf ("Server is waiting for client connect...\n");

        client_len = sizeof (client_address);
#if 1
	for(i=1; i<=SIGIO; i++) signal(i, sig_handle);
#endif
accept_again:
				if(i_tmp != 0)
				{
        	printf ("\nServer is waiting for client connect...\n");
					}
        client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t *)&client_len);
        
        if (client_sockfd == -1) {
                perror ("accept");
                exit (EXIT_FAILURE);
        }
				peer_sock_status =1;
        printf ("The server is waiting for client data...\n");
        strcpy(s_buf,"the tcp send stream to jss_server");

	while(1){

								memset(s_buf,0,MAX_TRANSMIT_DATA_LEN);
								memset(r_buf,0,8);
								sprintf(s_buf,"the %dth packet to jss_server !",i_tmp++);
		 						printf("write data :");

                if ((bytes = tcp_write(client_sockfd, s_buf, MAX_TRANSMIT_DATA_LEN,S_TIME_OUT)) <= 0) {
                        perror ("WWrite");
                        goto accept_again;

          			}
          			

								len += bytes;
								printf(" %d %d\n",bytes,len);
							
								usleep(2);
								printf(" %s %d The status of the client is %s \n",__FUNCTION__,__LINE__,r_buf);
	}
                close (client_sockfd);
                unlink ("server socket");
				 				goto accept_again;
}


 

client.c:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

#if 1
#define SOCK_UNIX_FILE "/tmp/video1_sock"
#else
#define SOCK_UNIX_FILE "/tmp/video_sock"
#endif
#define MAX_TRANSMIT_DATA_LEN 10240
#define C_TIME_OUT 2000 //2s

int tcp_read(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
	int ret;
	int total_lenth = 0;
	int len_remain = len;
	char *read_position = buf;
	struct timeval timeout;
	fd_set  rset, eset;

	timeout.tv_sec =timeout_ms/1000;
	timeout.tv_usec = timeout_ms%1000;
	//printf("read timeout set %d %d\n",timeout.tv_sec,timeout.tv_usec);

		
	do{
		
		FD_ZERO(&rset);
		FD_ZERO(&eset);
		FD_SET(socketfd, &eset);
		FD_SET(socketfd, &rset);	

		
		ret = select(socketfd+1, &rset, NULL, &eset, &timeout);
		
		if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
			//timeout
			//printf(" read timeout \n");
			break;
		}

		if(FD_ISSET(socketfd, &rset)){
			ret = recv(socketfd, read_position, len_remain, 0);
			if(ret < 0){
				//error
				//printf("read err\n");
				break;
			}
			if(ret == 0){
				//printf(" read %d..\n",ret);
				// peer close
				//printf(" peer close ?\n");
				break;
			}
				//printf(" read %d...\n",ret);
			
			read_position += ret;
			total_lenth += ret;
			len_remain -= ret;
			if(len_remain <=0) break;
			
		}

		if(FD_ISSET(socketfd, &eset)){
			printf("read err \n");
			break;

		}

	}while(0);
	
	
	//printf("time remain %d %d\n",timeout.tv_sec,timeout.tv_usec);
	return total_lenth;	
}

int tcp_write(int socketfd, char* buf, int len,unsigned int timeout_ms)
{
	int ret;
	int total_lenth = 0;
	int len_remain = len;
	char *write_position = buf;
	struct timeval timeout;
	fd_set  wset, eset;

	timeout.tv_sec =timeout_ms/1000;
	timeout.tv_usec = timeout_ms%1000;

	while(1){
		
		FD_ZERO(&wset);
		FD_ZERO(&eset);
		FD_SET(socketfd, &eset);
		FD_SET(socketfd, &wset);	
		ret = select(socketfd+1, NULL, &wset, &eset, &timeout);
		
		if( ( timeout.tv_sec == 0)  && ( timeout.tv_usec == 0) ){
			//timeout
			printf(" write timeout \n");
			break;
		}
		
		if(FD_ISSET(socketfd, &wset)){
			ret = send(socketfd, write_position, len_remain, 0);
			
			if(ret < 0){
				printf(" write err \n");
		
			}

			if(ret == 0){
				printf(" write ==0 ... \n");

			}

			write_position += ret;
			total_lenth += ret;
			len_remain -= ret;
			if(0 == len_remain) {
				break;
			}
			
		}

		if(FD_ISSET(socketfd, &eset)){
			printf(" err \n");
			break;

		}


	}

	//printf("write %d \n",len -len_remain);
	return len -len_remain ;	
}


int main (int argc, char *argv[])
{

    struct sockaddr_un address;
    int sockfd;
    int len;
    int i, bytes;
    int result;
    char ch_recv, ch_send;
    char r_buf[MAX_TRANSMIT_DATA_LEN];
    char s_buf[8];
    strcpy(s_buf,"LIVING");
    len = 0;
   
    if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
            perror ("socket");
            exit (EXIT_FAILURE);
    }

    address.sun_family = AF_UNIX;
    strcpy (address.sun_path, SOCK_UNIX_FILE);
    len = sizeof (address);

	    result = connect (sockfd, (struct sockaddr *)&address, len);
	    if (result == -1) {
	        printf ("ensure the server is up\n");
	        perror ("connect");
		 			exit (EXIT_FAILURE);
	    }
printf("%s %d Connect succeed !\n",__FUNCTION__,__LINE__);


	while(1){
		//memset(r_buf,0,MAX_TRANSMIT_DATA_LEN);
					bytes = tcp_read (sockfd, r_buf, MAX_TRANSMIT_DATA_LEN,C_TIME_OUT);
				//bytes = recv(sockfd, r_buf, 10240, 0);
	        if (bytes <= 0) {
	            perror ("read");
	            exit (EXIT_FAILURE);
	        }
		
					len +=bytes;
					printf("read data %d, %d\n",bytes,len);

					//sleep(5);
	}

    close (sockfd);

    return (0);
	
}




 

 

你可能感兴趣的:(UNIX本地套接字 示例)