本地socket 通讯

来源:互联网 发布:java中的关键字 编辑:程序博客网 时间:2024/05/21 16:26

#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;

 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);

 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");

 for(i=0;i<4;i++)
 write(connect_fd,snd_buf,sizeof(snd_buf));
 
 close(connect_fd);
 return 0;
}

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

#define UNIX_DOMAIN "/tmp/unix.domain"

int main()
{
 socklen_t clt_addr_len;
 int listen_fd;
 int com_fd;
 int old_fd;
 int ret;
 int i;
 static char recv_buf[1024]; 
 int len;

 struct sockaddr_un clt_addr;
 /*声明一个UNIX域套接字结构*/
 struct sockaddr_un srv_addr;
 /*创建 socket, 通信协议为PF_UNIX, SCK_STREAM 数据方式*/

 listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
 if(listen_fd<0){
  perror("cannot create listening socket");
  return 1;
 }
//配置服务器通讯协议
 srv_addr.sun_family=AF_UNIX;
 strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
 unlink(UNIX_DOMAIN);// /*删除原有server_socket对象*/
 /*绑定 socket 对象*/ 
 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;
 }
 /*监听网络,队列数为1*/
 ret=listen(listen_fd,1);
 if(ret==-1){
  perror("cannot listen the client connect request");
  close(listen_fd);
  unlink(UNIX_DOMAIN);
  return 1;
 }
 
 len=sizeof(clt_addr);
 
 /*接受客户端请求; 第2个参数用来存储客户端地址; 第3个参数用来存储客户端地址的大小*/
 /*建立(返回)一个到客户端的文件描述符,用以对客户端的读写操作*/
 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; 
 }
 
 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;
}

 

原创粉丝点击