Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47513
  • 博文数量: 20
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-16 15:07
文章分类

全部博文(20)

文章存档

2010年(15)

2008年(5)

我的朋友

分类: C/C++

2008-10-19 22:01:50

UNIX域流套接字例子:
 
 
-----------------------------------------------------------------------------------
UNIX域面向连接
-----------------------------------------------------------------------------------
UNIX域面向连接的服务器端程序
 

#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
......
#define NAME "my_sock"

main()
{

    int orig_sock, //服务器端原来套接字描述符

                               new_sock, //新的套接字描述符

                               clnt_len, //客户端地址长度

                               i; //循环计数器


    static struct sockaddr_un clnt_adr, //客户-服务器的UNIX地址

                               serv_adr;

    static char buf[128]; //消息缓冲区


    void clean_up(int , char *); //关闭套接字并删除例程

    if((orig_sock = socket(AF_UNIX,SOCK_STREAM,0)) < 0)
    {
          peeror("generate error");
          exit(1);
    }
    serv_adr.sun_family = AF_UNIX;
    strcpy(serv_adr.sun_path,NAME);
    unlink(NAME);
    if(bind(orig_sock, (struct sockaddr *)&serv_adr,sizeof(serv_adr.sun_family)
       +strlen(serv_adr.sun_path)) < 0)
    {
          peeror("bind error");
          clean_up(orig_sock,NAME);
          exit(2);
    }
    listen(orig_sock,1);
    clnt_len = sizeof(clnt_adr);
    if((new_sock = accept (orig_sock,(struct sockaddr *)&clnt_adr,&clnt_len))<0)
    {
          peeror("accept error");
          exit (3);
    }
    for(i =1;i<=10;i++)
    {
          sleep(1);
          read(new_sock,buf,sizeof(buf));
          printf("%s\n\n",buf);
    }
    close(new_sock);
    clean_up(orig_sock,NAME);
    exit(0);
}
void clean_up(int sd,char * the_file)
{
     close(sd);
     unlink(the_file);
}

 
 
UNIX域面向连接的客户端程序
 

#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
......
#define NAME "my_sock"

main()
{

    int orig_sock, //客户端原来套接字描述符
    
                               i; //循环计数器


    static struct sockaddr_un serv_adr;

    static char buf[10]; //消息缓冲区

    if((orig_sock = socket(AF_UNIX,SOCK_STREAM,0)) < 0)
    {
          peeror("generate error");
          exit(1);
    }
    
    serv_adr.sun_family = AF_UNIX;
    strcpy(serv_adr.sun_path,NAME);

    if(connect(orig_sock, (struct sockaddr *)&serv_adr,sizeof(serv_adr.sun_family)
       +strlen(serv_adr.sun_path)) < 0)
    {
          peeror("connect error");
          exit(1);
    }
    
    for(i =1;i<=10;i++)
    {
          sprintf(buf,"c: %d\n\n",i);
          write(orig_sock,buf,sizeof(buf));
    }
    close(orig_sock);
    exit(0);
}

 

-----------------------------------------------------------------------------------
因特网域面向连接
-----------------------------------------------------------------------------------
因特网域面向连接的服务器端程序
 

#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
......
#define PORT 6996

main(void)
{

    int orig_sock,
//服务器端原来套接字描述符


                               new_sock,
//新的套接字描述符


                               clnt_len;
//客户端地址长度


    static struct sockaddr_in clnt_adr,
//客户-服务器的UNIX地址


                               serv_adr;
                               
    int len , i;

    static char buf[128];
//消息缓冲区


    if((orig_sock = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
          peeror("generate error");
          exit(1);
    }
    
    memset(&serv_adr,0,sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(PORT);

    if(bind(orig_sock, (struct sockaddr *)&serv_adr,sizeof(serv_adr)) < 0)
    {
          peeror("bind error");
          close(orig_sock);
          exit(2);
    }
    
    if(listen(orig_sock,5)<0)
    {
            peeror("listen error");
        close(orig_sock);
        exit(3);
    }
    do
    {
            clnt_len = sizeof(clnt_adr);
            if((new_sock = accept (orig_sock,(struct sockaddr *)&clnt_adr,&clnt_len))<0)
            {
              peeror("accept error");
              close(orig_sock);
              exit (4);
            }
            if(fork() == 0)
            {
                    while((len = read(new_sock,buf,128)) >0)
                    {
                            for(i = 0;i<len;++i)
                            buf[i] = toupper(buf[i]);
                            write(new_sock,buf,len);
                            if(buf[0] == '.')
                                    break;
                    }
                    close(new_sock);
                    exit(0);
            }
            else
                    close(new_sock);
    )
    while(1);
}

因特网域面向连接的客户端程序

#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
......
#define PORT 6996

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

    int orig_sock,
//客户端原来套接字描述符

     
                               len;
//服务器地址长度


    static struct sockaddr_in serv_adr;
//服务器的Internet地址

    
    struct hostent host;
//主机(服务器)


    static char buf[128];
//消息缓冲区

    
    if(argc!=2)
    {
            fprintf(stderr,"usage: %s server\n\n",argv[0]);
            exit(1);
    }
        host = gethostbyname(argv[1]);
//取得主机信息

        if(host == (struct hostent *)NULL)
        {
                perror("gethostbyname");
                exit(2);
        }
        memset(&serv_adr,0,sizeof(serv_adr));
//清除结构

        serv_adr.sin_family = AF_INET;
//设置地址类型

        memcpy(&serv_adr.sin_addr,host->h_addr,host->h_length);
//地址

        serv_adr.sin_port = htons(PORT);
//使用我们的假地址

        
    if((orig_sock = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
          peeror("generate error");
          exit(3);
    }

    if(connect(orig_sock, (struct sockaddr *)&serv_adr,sizeof(serv_adr)) < 0)
    {
          peeror("connect error");
          exit(4);
    }

    do
    {
            write(fileno(stdout),">",3);
//提示用户

            if((len = read(fileno(stdin),buf,128))>0)
//得到用户输入

            {
                    write(orig_sock,buf,len);
//写到套接字

                    if((len = read(orig_sock,buf,len))>0)
//如果返回

                            write(fileno(stdout),buf,len);
//显示它

            }
    )
    while(buf[0] != '.');
    close(orig_sock);
    exit(0);
}

阅读(791) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:套接字基础

给主人留下些什么吧!~~