socket伺服器端:server.c
//socket讀寫預設的是非阻塞的
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>#include <sys/types.h>#include <errno.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/select.h>#include <unistd.h>#include <termios.h>#include <sys/stat.h>/**********定時器標頭檔***************/#include <sys/time.h> #include <signal.h> /***********進程間SOCKET通訊標頭檔**********/#include <sys/socket.h> #include <sys/un.h> #define UNIX_DOMAIN "/tmp/UNIX2.domain" static char recv_php_buf[256];//接收client資料的緩衝static int recv_php_num=0;//接收client資料的總長度const char recv_php_buf1[20]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};void main(){socklen_t clt_addr_len; int listen_fd; int com_fd; int ret=0; int i; int len; struct sockaddr_un clt_addr; struct sockaddr_un srv_addr; while(1){//建立用於通訊的通訊端,通訊域為UNIX通訊域 listen_fd=socket(AF_UNIX,SOCK_STREAM,0); if(listen_fd<0){ perror("cannot create listening socket"); continue; } else{while(1){//設定伺服器位址參數 srv_addr.sun_family=AF_UNIX; strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1); unlink(UNIX_DOMAIN); //綁定通訊端與伺服器位址資訊 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); break; } //對通訊端進行監聽,判斷是否有串連請求 ret=listen(listen_fd,1); if(ret==-1){ perror("cannot listen the client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); break; } chmod(UNIX_DOMAIN,00777);//設定通訊檔案許可權while(1){//當有串連請求時,調用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); break; } //讀取並輸出用戶端發送過來的串連資訊 memset(recv_php_buf,0,256); recv_php_num=read(com_fd,recv_php_buf,sizeof(recv_php_buf)); printf("\n=====recv=====\n");for(i=0;i<recv_php_num;i++) printf("%d ",recv_php_buf[i]); printf("\n");/*if(recv_php_buf[0]==0x02){if(recv_php_buf[recv_php_num-1]==0x00){recv_php_buf[recv_php_num-1]=0x01;}else{recv_php_buf[recv_php_num-1]=0x00;}}*///recv_php_buf[20]+=1;write(com_fd,recv_php_buf,recv_php_num);printf("\n=====send=====\n");for(i=0;i<recv_php_num;i++) printf("%d ",recv_php_buf[i]); printf("\n");//write(com_fd,recv_php_buf,20);close(com_fd);//注意要關閉串連符號,不然會超過串連數而報錯}}}}
socket使用者端:client.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>#include <sys/types.h>#include <errno.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/select.h>#include <unistd.h>#include <termios.h>#include <sys/stat.h>/**********定時器標頭檔***************/#include <sys/time.h> #include <signal.h> /***********進程間SOCKET通訊標頭檔**********/#include <sys/socket.h> #include <sys/un.h> #include <sys/ioctl.h>#pragma pack(1)//設定為1位元組對齊#define UNIX_DOMAIN2 "/tmp/UNIX2.domain" static char recv_php_buf[256]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};struct test{char a;int b;int c;}se;void main(void){int connect_fd;int ret=0;int i;static struct sockaddr_un srv_addr; printf("ipc通訊線程\n");//while(1)//{//建立用於通訊的通訊端,通訊域為UNIX通訊域 connect_fd=socket(AF_UNIX,SOCK_STREAM,0); printf("%d\n",connect_fd); if(connect_fd<0){ perror("cannot create communication socket");printf("%d\n",connect_fd); //continue;} else{//while(1)//{srv_addr.sun_family=AF_UNIX; strcpy(srv_addr.sun_path,UNIX_DOMAIN2);//串連伺服器 ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1){ close(connect_fd); printf("connect fail\n");//break;//重新建立socket}else{//否則,串連伺服器成功//while(1)//{se.a=0x01;se.b=0x01020304;se.c=0x05060708;write(connect_fd,recv_php_buf,20);//將資料傳送到外部應用程式,發送實際長度//write(connect_fd,&se,sizeof(struct test));memset(recv_php_buf,0,sizeof(recv_php_buf)); //清空socket_buf//sleep(1);//fcntl(connect_fd,F_SETEL,O_NONBLOCK);read(connect_fd,recv_php_buf,sizeof(recv_php_buf));printf("receive over\n");for(i=0;i<20;i++)printf("%x ",recv_php_buf[i]);//printf("%x ",se.a);//printf("%x ",se.b);//printf("%x ",se.c);close(connect_fd);//break;//}}//}//close(connect_fd);}//}}