博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

嵌入式linux

构建完善的嵌入式linux平台
   uClinux.cublog.cn
关于作者  
姓名:panhuachun@hotmail.com
职业:软件工程师
年龄:24
位置:China
个性介绍:构建优美的嵌入式平台

我的分类  




进程通信-本机socket 和多路I/O
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXSOCKFD 10
#define GSMD_UNIX_SOCKET "\0gsmd"
#define GSMD_UNIX_SOCKET_TYPE SOCK_STREAM
 
int main(int argc,char *argv[])
{
 int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;
 struct sockaddr_un addr;
 int addr_len = sizeof(struct sockaddr_in);
 fd_set readfds;
 char buffer[256];
 char msg[ ] ="Welcome to server!";
 
 if ((sockfd = socket(PF_UNIX, GSMD_UNIX_SOCKET_TYPE, 0))<0){//isockfd = socket(AF_INET,SOCK_STREAM,0)
  perror("socket");
  exit(1);
 }
 
 bzero(&addr,sizeof(addr));
/*
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
*/
 addr.sun_family = AF_UNIX;
 memcpy(addr.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET));
 
 if(bind(sockfd,(struct sockaddr *)&addr,sizeof(addr))<0){// bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)
  perror("connect");
  exit(1);
 }
 
 if(listen(sockfd,10)<0){
  perror("listen");
  exit(1);
 }
 for(fd=0;fd<MAXSOCKFD;fd++)
  is_connected[fd]=0;
 while(1)
 {
  FD_ZERO(&readfds);
  FD_SET(sockfd,&readfds);
  //加入到is_connected【】数组中,数组下标为文件描述符,对应的数组值为0或1表示是否为连接
  for(fd=0;fd<MAXSOCKFD;fd++)
   if(is_connected[fd])
     FD_SET(fd,&readfds);
  // 
  if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))
   continue;
  
  for(fd=0;fd<MAXSOCKFD;fd++)
  {
   if(FD_ISSET(fd,&readfds))
   {
     if(sockfd == fd)
     {
       if((newsockfd = accept (sockfd,(struct sockaddr *)&addr,(socklen_t*)&addr_len))<0)
         perror("accept");
       
       write(newsockfd,msg,sizeof(msg));
       is_connected[newsockfd] =1;
       //printf("cnnect from %s\n",inet_ntoa(addr.sin_addr));
     }else{
       bzero(buffer,sizeof(buffer));
       if(read(fd,buffer,sizeof(buffer))<=0)
       {
         printf("connect closed.\n");
         is_connected[fd]=0;
         close(fd);
       }
       else
         printf("%s\n",buffer);
     }
   }
  }
 }

}
 
 
 
 
-----------
client.c
 
-----------
 
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define GSMD_UNIX_SOCKET "\0gsmd"
#define GSMD_UNIX_SOCKET_TYPE SOCK_STREAM
 
int main(int argc,char *argv[])
{
  int rc;
  int fd;
  struct sockaddr_un sun;
  char data[12]="9999\n";
  
  /* use unix domain socket to gsm daemon */
  printf("starting...\n");
  fd = socket(PF_UNIX, GSMD_UNIX_SOCKET_TYPE, 0);
 
  if (fd < 0)
   return fd;
  printf("starting...\n");
  memset(&sun, 0, sizeof(sun));
  sun.sun_family = AF_UNIX;
  memcpy(sun.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET));
  printf("starting...\n");
  rc = connect(fd, (struct sockaddr *)&sun, sizeof(sun));
  if (rc < 0) {
   printf("not connect...\n");
   close(fd);
   fd = -1;
   return rc;
  }
  for(;;){
   usleep(100000);
   send(fd, data, strlen(data), 0);
  }
  printf("end\n");
  return 0;
}
 

 发表于: 2008-03-27,修改于: 2008-03-29 16:14 已浏览298次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:4.42676

京ICP证041476号