QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1528|回复: 10

谁能来说说用socket实现进程间通讯的方式?

[复制链接]
发表于 2004-3-11 15:48:10 | 显示全部楼层 |阅读模式
听说可以是吧?
这样的实现方式可以和其他类型语言实现的网络接口互通么?
发表于 2004-3-11 21:03:11 | 显示全部楼层
嘿嘿~其实很简单啦~socket进行网络编程会吧?
socket函数写成:
socket(AF_UNIX,...)//后面和网络编程的一样
回复

使用道具 举报

发表于 2004-3-11 21:11:59 | 显示全部楼层
对了~把sockaddr_in改成struct sockaddr_un
给你个代码好了:
[code:1]
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

#define NSTRS        3
#define        ADDRESS        "mysocket"

char *strs[NSTRS]=
{
        "This is the first string from the client.\n",
        "This is the second string from the client.\n",
        "This is the third string from the client.\n"
};

int main()
{
        char c;
        FILE *fp;
        register int k,s,len;
        struct sockaddr_un saun;
       
        if((s=socket(AF_UNIX,SOCK_STREAM,0))<0)
        {
                perror("ERR\n");
                exit(-1);
        }
       
        saun.sun_family=AF_UNIX;
        strcpy(saun.sun_path,ADDRESS);
        len=sizeof(saun.sun_family)+strlen(saun.sun_path);
        if(connect(s,&saun,len)<0)
        {
                perror("ERR\n");
                exit(-1);
        }
       
        fp=fdopen(s,"r");
        for(k=0;k<NSTRS;k++)
        {
                while((c=fgetc(fp))!=EOF)
                {
                        putchar(c);
                        if('\n'==c)
                                break;
                }
        }
       
        for(k=-;k<NSTRS;k++)
                send(s,strs[k],strlen(strs[k]),0);
       
        close(s);
        return 0;
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-3-12 09:02:01 | 显示全部楼层
默难,
这种做法是用什么方式来指定一个通信的标志的呢
那个#define   ADDRESS   "mysocket"
是用这个字符串作为这个标志?
能不能解释的详细一些?或者哪里有相关的资料?
回复

使用道具 举报

发表于 2004-3-12 09:43:52 | 显示全部楼层
Linux程序设计(第二版)Neil Matthew等杨晓云等译  第十四章
Unix网络程序设计(卷一) Stevens著 --Unix Domain Protocal一章
回复

使用道具 举报

 楼主| 发表于 2004-3-12 10:18:06 | 显示全部楼层
:-( 我是说电子版的  穷人买不起书 说实在这两本书也买不到
其实也不需要这么完整的 哪里有这个部分的介绍就可以了
回复

使用道具 举报

发表于 2004-3-12 10:44:41 | 显示全部楼层
有几个不一样的地方:
1.如程序AF_UNIX标志
2.会在当前目录下生成一个文件,名字就是你问的那个define
3.用完后要删除这个文件,否则下次启动会出错
我也写了一个(对不起,并不健壮):先运行服务器,再运行客户客户有参数为: 你的可执行名  要连接的服务器名   要发的信息 (其中,要连的服务器名在服务器端sockaddr_un.sun_path中指定,我用strcpy拷的那个,客户不是连到这个名字,就无法连上,就如IP地址不对一样)
服务器:
[code:1]
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>

int main(){
  int serv_sock,cli_sock;
  int server_len,client_len;
  struct sockaddr_un server_address;
  struct sockaddr_un client_address;
  
  unlink("linuxfans");
  serv_sock = socket(AF_UNIX,SOCK_STREAM,0);
  
  server_address.sun_family = AF_UNIX;
  strcpy(server_address.sun_path, "linuxfans");
  server_len = sizeof(server_address);
  bind(serv_sock,(struct sockaddr*)&server_address,server_len);

  listen(serv_sock,5);
  while(1){
    char message_from_client[256];
  
    int get_count;

    printf("Server process is running\n Wait connecting from client process\n");
   
    client_len = sizeof(client_address);
    cli_sock = accept(serv_sock,(struct sockaddr*)&client_address,&client_len);

    get_count=read(cli_sock,message_from_client,sizeof(message_from_client));
    message_from_client[get_count]='\0';
    printf("Get message from client:%s\n",message_from_client);
   
    //you may do something with message from client
    write(cli_sock,"hello wsm!",11);

    close(cli_sock);
  }
}
[/code:1]

客户端:
[code:1]
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc,char** argv){
  int socket_client;
  int len;
  struct sockaddr_un serv_addr;
  int result;
  char message[256];
  int get_count;


  if(argc!=3){
    fprintf(stderr,"usage:%s  linuxfans  message(you want it to be send to server)\n",argv[0]);
    exit(1);
  }

  
  socket_client = socket(AF_UNIX,SOCK_STREAM,0);
  serv_addr.sun_family = AF_UNIX;
  strcpy(serv_addr.sun_path,argv[1]);
  len = sizeof(serv_addr);
  
  result = connect(socket_client,(struct sockaddr*)&serv_addr,len);
  
  if (result == -1){
    perror("connect failed!\n");
    exit(1);
  }


  write(socket_client,argv[2],256);
  
  get_count=read(socket_client,message,sizeof(message));
  message[get_count]='\0';
  printf("message from server: \n    %s\n ",message);
  

  close(socket_client);
  
  exit(0);
  
}
[/code:1]
回复

使用道具 举报

发表于 2004-3-12 10:57:30 | 显示全部楼层
另外,就是这两本书对这个问题也只有薄薄的两页(还包括程序)。所以也没什么好看的,要关心的就是当你建好连接后,相互通信就和文件读写一样(比如用的函数)
回复

使用道具 举报

 楼主| 发表于 2004-3-12 11:23:49 | 显示全部楼层
感觉这个机制不太可靠阿 好像...... 但这么做可以把网络通讯和进程间通讯和并封装倒是很有好处
另外问一下 这种机制可以在两台机器间实现么? 比如说我连到
server1:\\tmp\serversock ??
回复

使用道具 举报

发表于 2004-3-12 17:39:56 | 显示全部楼层
[quote:7e2024e27f="wsm"]默难,
这种做法是用什么方式来指定一个通信的标志的呢
那个#define   ADDRESS   "mysocket"
是用这个字符串作为这个标志?
能不能解释的详细一些?或者哪里有相关的资料?[/quote]
那个字符串在UNP里面Stevens把它叫做path name
嗯……我手头有UNP的电子版~
回复

使用道具 举报

发表于 2004-3-12 23:43:57 | 显示全部楼层
hoho~,看来sagaeon也是高手呀~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 20:04 , Processed in 0.042302 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表