Linux 网络编程之tcp/ip

一、用AF_UNIX,进行进程间的通信;

/*server1.c*/

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

int main()
{
        int server_fd,client_fd;
        struct sockaddr_un myaddr;
        struct sockaddr_un clientaddr;
        myaddr.sun_family=AF_UNIX;
        strcpy(myaddr.sun_path,"mysocketfile");
        int clientaddr_len=sizeof(clientaddr);

        server_fd=socket(AF_UNIX,SOCK_STREAM,0);                                    //2.建立套接字;
        if(server_fd==-1)
        {
                perror("socket error");
                exit(1);
        }
        if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)          //2.绑定;
        {
                perror("bind error");
                exit(1);
        }

        if(listen(server_fd,20)==-1)                                             //3.监听端口;
        {
                perror("listen error");
                exit(1);
        }
        printf("listening...\n");

        client_fd=accept(server_fd,(struct sockaddr*)&clientaddr,&clientaddr_len);//4.堵塞并接收客户端的信息;
        if(client_fd==-1)
        {
                perror("accept error");
                exit(1);

        }
        printf("accept client\n");
        write(client_fd,"hello world",11);//5.进行读和写;
        close(client_fd);
        close(server_fd);
}

/*client1.c*/

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

int main()
{
        int server_fd;
        char buf[100];
        struct sockaddr_un myaddr;
        myaddr.sun_family=AF_UNIX;
        strcpy(myaddr.sun_path,"mysocketfile");
    
        server_fd=socket(AF_UNIX,SOCK_STREAM,0);                           //1.建立socket套接字;
        if(server_fd==-1)
        {
                perror("socket error");
                exit(1);
        }
        if(connect(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)//2.连接connext.
        {
                perror("connet error");
                exit(1);
        }
        read(server_fd,buf,100);                                           //3.读或写
        printf("get msg is:%s\n",buf);
        close(server_fd);
}

二、用AF_INET,进行网络操作;

/*server2.c*/

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

int main()
{
        int server_fd,client_fd;
        struct sockaddr_in myaddr;
        struct sockaddr_in clientaddr;
        myaddr.sin_family=AF_INET;//family是协议族的意思;
        myaddr.sin_addr.s_addr=htonl(INADDR_ANY);/*如果要接收来自指定的IP地址的客户
端的话,就要把INADDR_ANY改成IP地址即可。这里接收来自任何地址的客户端;*/
        myaddr.sin_port=htons(8080);/*由于网络传输是通过二进制进行传输的,所以要转>换为网络字节顺序*/
        int clientaddr_len=sizeof(clientaddr);

        server_fd=socket(AF_INET,SOCK_STREAM,0);
        if(server_fd==-1)
        {
                perror("socket error");
                exit(1);
        }
        if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
        {
                perror("bind error");
                exit(1);
        }

        if(listen(server_fd,20)==-1)
        {
                perror("listen error");
                exit(1);
        }
        printf("listening...\n");

        client_fd=accept(server_fd,(struct sockaddr*)&clientaddr,&clientaddr_len);
        if(client_fd==-1)
      {
                perror("accept error");
                exit(1);

        }
        printf("accept client\n");
        write(client_fd,"hello world",11);
        close(client_fd);
        close(server_fd);
}

/*clien2.c*/

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

int main()
{
        int server_fd;
        char buf[100];
        struct sockaddr_in myaddr;
        myaddr.sin_family=AF_INET;
        myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
        myaddr.sin_port=htons(8080);

        server_fd=socket(AF_INET,SOCK_STREAM,0);
        if(server_fd==-1)
        {
                perror("socket error");
                exit(1);
        }
        if(connect(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
        {
                perror("connet error");
                exit(1);
        }
        read(server_fd,buf,100);
        printf("get msg is:%s\n",buf);
        close(server_fd);
}

三、循环接受客户端请求

只需在accept到close(client_fd)加入循环结构即可;

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

int main()
{
        int server_fd,client_fd;
        struct sockaddr_in myaddr;
        struct sockaddr_in clientaddr;
        myaddr.sin_family=AF_INET;//family是协议族的意思;
        myaddr.sin_addr.s_addr=htonl(INADDR_ANY);/*如果要接收来自指定的IP地址的客户
端的话,就要把INADDR_ANY改成IP地址即可。这里接收来自任何地址的客户端;*/
        myaddr.sin_port=htons(8080);/*由于网络传输是通过二进制进行传输的,所以要转>换为网络字节顺序*/
        int clientaddr_len=sizeof(clientaddr);

        server_fd=socket(AF_INET,SOCK_STREAM,0);
        if(server_fd==-1)
        {
                perror("socket error");
                exit(1);
        }
        if(bind(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
        {
                perror("bind error");
                exit(1);
        }

        if(listen(server_fd,20)==-1)
        {
                perror("listen error");
                exit(1);
        }
        printf("listening...\n");

        while(1)
       {
                client_fd=accept(server_fd,(struct sockaddr*)&clientaddr,&clientaddr_len);
                if(client_fd==-1)
               {
                       perror("accept error");
                       exit(1);

               }
               printf("accept client\n");
               write(client_fd,"hello world",11);
               close(client_fd);
        }
        close(server_fd);
}

四、不通过IP来请求服务器,而是通过hostname来请求;

#include<sys/socket.h>
#include<sys/un.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<netinet/in.h>

int main(int argc,char *argv[])
{
        if(argc<2)
        {
                perror("argcument error");
                exit(1);
        }
        int server_fd;
        struct hostent *myhost;
        char buf[100];
        struct sockaddr_in myaddr;
        myaddr.sin_family=AF_INET;
        myhost=gethostbyname(argv[1]);
        if(!myhost)
        {
                perror("gethost error");
                exit(1);
        }
        myaddr.sin_addr=*((struct in_addr *)myhost->h_addr);
        myaddr.sin_port=htons(8080);

        server_fd=socket(AF_INET,SOCK_STREAM,0);
        if(server_fd==-1)
        {
                perror("socket error");
                exit(1);
        }
        if(connect(server_fd,(struct sockaddr*)&myaddr,sizeof(myaddr))==-1)
        {
                perror("connet error");
                exit(1);
        }
        read(server_fd,buf,100);
        printf("get msg is:%s\n",buf);
        close(server_fd);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值