本地socket与网络socket实现

转载 2018年04月16日 13:53:20

Linux进程间通信方式–本地socket

服务端:

//s_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> 
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
    socklen_t clt_addr_len;
    int listen_fd;
    int com_fd;
    int ret;
    int i;
    static char recv_buf[1024]; 
    int len;
    struct sockaddr_un clt_addr;
    struct sockaddr_un srv_addr;
    listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
    if(listen_fd<0)
    {
        perror("cannot create communication socket");
        return 1;
    }  

    //set server addr_param
    srv_addr.sun_family=AF_UNIX;
    strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
    unlink(UNIX_DOMAIN);
    //bind sockfd & addr
    ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
    if(ret==-1)
    {
        perror("cannot bind server socket");
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 1;
    }
    //listen sockfd 
    ret=listen(listen_fd,1);
    if(ret==-1)
    {
        perror("cannot listen the client connect request");
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 1;
    }
    //have connect request use accept
    len=sizeof(clt_addr);
    com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
    if(com_fd<0)
    {
        perror("cannot accept client connect request");
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 1;
    }
    //read and printf sent client info
    printf("/n=====info=====/n");
    for(i=0;i<4;i++)
    {
        memset(recv_buf,0,1024);
        int num=read(com_fd,recv_buf,sizeof(recv_buf));
        printf("Message from client (%d)) :%s/n",num,recv_buf);  
    }
    close(com_fd);
    close(listen_fd);
    unlink(UNIX_DOMAIN);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

客户端

//c_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
    int connect_fd;
    int ret;
    char snd_buf[1024];
    int i;
    static struct sockaddr_un srv_addr;
//creat unix socket
    connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
    if(connect_fd<0)
    {
        perror("cannot create communication socket");
        return 1;
    }   
    srv_addr.sun_family=AF_UNIX;
    strcpy(srv_addr.sun_path,UNIX_DOMAIN);
//connect server
    ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
    if(ret==-1)
    {
        perror("cannot connect to the server");
        close(connect_fd);
        return 1;
    }
    memset(snd_buf,0,1024);
    strcpy(snd_buf,"message from client");
//send info server
    for(i=0;i<4;i++)
        write(connect_fd,snd_buf,sizeof(snd_buf));
    close(connect_fd);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

Socket 通信之网络通信

服务端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>


#define SIZE 100

int main(int argc, char **argv)
{
      int sock_fd;
      struct sockaddr_in sin;
      //创建套接字
      if( (sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0){
        perror("socket");
        exit(1);
      }

      //填充地址
      bzero(&sin,sizeof(sin));
      sin.sin_family = AF_INET;
      if(argc != 3){
        sin.sin_port = htons(8888);
        sin.sin_addr.s_addr = inet_addr("192.168.7.5");
      }else{
        sin.sin_port = htons(atoi(argv[1]));
        sin.sin_addr.s_addr = inet_addr(argv[2]);
      }

      if(connect(sock_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0){
        perror("connect");
        exit(1);
      }


      //和客户端进行通信
      char buf[SIZE];
      while(1){
        fgets(buf,SIZE,stdin);
        write(sock_fd,buf,strlen(buf));
        if(strncmp(buf,"quit",4) == 0)
          break;
      }

      close(sock_fd);
      return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

客户端

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>


#define SIZE 100

int main(int argc, char **argv)
{
      int sock_fd,conn_fd;
      struct sockaddr_in sin,cin;
      //创建套接字
      if( (sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0){
        perror("socket");
        exit(1);
      }

      //填充地址
      bzero(&sin,sizeof(sin));
      sin.sin_family = AF_INET;
      if(argc != 3){
        sin.sin_port = htons(8888);
        sin.sin_addr.s_addr = inet_addr("192.168.7.5");
      }else{
        sin.sin_port = htons(atoi(argv[1]));
        sin.sin_addr.s_addr = inet_addr(argv[2]);
      }

      //绑定地址
      if(bind(sock_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0){
        perror("bind");
        exit(1);
      }
      //监听套接字
      if(listen(sock_fd,8) < 0){
        perror("listen");
        exit(1);
      }
      //等待接收链接,使进程阻塞,直到有新的客户端请求链接为止
      bzero(&cin,sizeof(cin));
      socklen_t len = sizeof(cin);
      printf("listen....\n");
      if( (conn_fd = accept(sock_fd,(struct sockaddr*)&cin,&len)) < 0){
        perror("accept");
        exit(1);
      }
      printf("客户端%s链接成功!\n",inet_ntoa(cin.sin_addr));
      //和客户端进行通信
      char buf[SIZE];
      int ret;
      while(1){
        bzero(buf,SIZE);
        if( (ret = read(conn_fd,buf,SIZE)) < 0){
          perror("read");
          exit(1);
        }else if( ret == 0){
          printf("客户端已断开\n");
          break;
        }else{
          if(strncmp(buf,"quit",4) == 0)
            break;
          printf("%s",buf);
        }
      }

      close(sock_fd);
      close(conn_fd);
      return 0;
}

python网络编程(socket)

-
  • 1970年01月01日 08:00

socket编程及本地socket实现

在项目中常常需要进程间通讯,但是往往本地socket复杂些,但是更灵活些,毕竟功能强大些1.socketint socket(int doamin,int type,int pro);功能:通过该函数...
  • leumber
  • leumber
  • 2017-03-20 17:53:47
  • 2221

linux本地进程间socket通信是否经过网卡?

转自:https://www.zhihu.com/question/43590414 结论:不走网卡,不走物理设备,但是走虚拟设备,loopback device环回. 最简单的办法,拔掉网线...
  • cloudeagle_bupt
  • cloudeagle_bupt
  • 2016-07-23 16:55:34
  • 1498

socket连接和http连接的区别

首先一定要明白: HTTP协议:简单对象访问协议,对应于应用层  ,HTTP协议是基于TCP连接的 tcp协议:    对应于传输层 ip协议:     对应于网络层   TCP/IP是传输层...
  • wwd0501
  • wwd0501
  • 2016-09-02 11:25:55
  • 7564

socket中的网络字节序/本地字节序互相转换函数。

(1)inet_addr :转换字符串到地址结构体 (2)inet_ntoa 转换地址结构体到字符串 (3)htons  ,h=host,n=network.常用于绑定之前地址结构体的设置,将本机...
  • wks19891215
  • wks19891215
  • 2016-01-24 00:48:07
  • 2177

linux 系统下使用socket进行本地进程间通信

使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。 其主要...
  • baidu_24553027
  • baidu_24553027
  • 2017-02-07 17:16:13
  • 2547

基于Socket编程的网络聊天室

可行性分析 (1)操作可行性 聊天室是提供给网民一个交友与娱乐的场所。在聊天室里,网民可选择自己的聊天对象,与其进行对话交流,是网民之间相互沟通、交流情感的最佳方式之一。 利用聊天室,用户可...
  • johnWcheung
  • johnWcheung
  • 2017-04-12 23:33:50
  • 2101

socket编程(1)—— 一对一通信(本地IPC和网络)

一 网络基础知识1 OSI七层协议模型  人和计算机之间交互分了7层(OSI 7层模型):物理层、数据链路层、网络层、传输层、会话层、表现层、应用层。   TCP/IP协议模型中,把应用、表现和会话...
  • Robot__Man
  • Robot__Man
  • 2016-08-24 17:20:22
  • 929

Socket编程实现简易聊天室

1.Socket基础知识   Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求。   Socket是支持TCP/IP协议的网...
  • salahelx
  • salahelx
  • 2015-06-21 23:13:46
  • 8253

本地socket的select用法

学习socket的select用法,下面代码大部分是从网上借鉴的,只不过把网络部分的socket的用法改为了本地socket,外加一些自己的处理,如果有冒犯之处请联系我,我立马删除,谢谢。...
  • u012656927
  • u012656927
  • 2017-07-04 20:37:54
  • 445
收藏助手
不良信息举报
您举报文章:本地socket与网络socket实现
举报原因:
原因补充:

(最多只允许输入30个字)