PHP與C(或其它語言)經過訊息佇列進行通訊,完整代碼

來源:互聯網
上載者:User
PHP與C(或其它語言)通過訊息佇列進行通訊,完整代碼

轉載自: PHP與C(或其它語言)通過訊息佇列進行通訊,完整代碼

?

');}$this->id = $_id;$this->msg_id = msg_get_queue ( $_id );$this->_serialize = $_serialize;if ($this->msg_id === false) {die(basename(__FILE__).'->'.__LINE__.': Unable to create message quee');}}/** * @data data to send * @type message type */public function send( $data, $type = 1, $blocking = false ){if (!msg_send ($this->msg_id, $type, $data, $this->_serialize, $blocking, $msg_err)){return "Msg not sent because $msg_err\n";}return true;}/** * @param $type message type * @param $maxsize The maximum size of message to be accepted, */public function receive($no_wait = true, $type = 1 , $maxsize = 1024 ){$rs = msg_receive ( $this->msg_id , $type ,$type , $maxsize , $message , $this->_serialize, $no_wait?MSG_IPC_NOWAIT:NULL , $errorcode);if($rs)return $message;elsereturn false;}public function remove(){msg_remove_queue($this->msg_id);}}

?

remove();  $str = 'There are no user contributed notes for this page.';while(1){        $data = substr($str,0,rand(18,25));        $msg->send(rand().$data, rand(1,10));        echo $data." -> sent\n";        echo 'Get:'.$msg1->receive(false, 0).chr(10);        sleep(3);        //usleep(10000);}echo 'Done';


?

C, gcc -g -o m msg.c -lpthread;

#include #include #include #include #include #include #include #include #include #define MAX_MSG_LEN 512static int php_msg = -1;static int php_msg1 = -1;static int running = 1;static void *php_msg_handler_thread(void *arg);static int msg_send(int msg_id, int fd, char *data);struct msg_st {long mtype;char mtext[MAX_MSG_LEN];};int main(int argc,char **argv){printf("go 1 \n");if((php_msg= msgget((key_t)1,0666|IPC_CREAT)) == -1){perror("php_msg create");return 0;}if((php_msg1= msgget((key_t)2,0666|IPC_CREAT)) == -1){perror("php_msg create");return 0;}/////////////////////////////////////////////////////////////////////////////////pthread_t php_msg_pthread;int rs = pthread_create(&php_msg_pthread, NULL, (void*(*)(void*))php_msg_handler_thread, (void *)NULL);if(rs!=0){perror("php_msg_pthread create");return 0;}pthread_join(php_msg_pthread, NULL);return 0;}static void *php_msg_handler_thread(void *arg){struct msg_st php_data;printf("sizeof(struct msg_st)=%d\n",sizeof(struct msg_st));char* data;data = malloc(MAX_MSG_LEN);char *pre = "You told me:";while(running){//ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); if(msgrcv(php_msg,(void *) &php_data, MAX_MSG_LEN, 0 , 0) == -1){perror("msgrcv");if(errno==E2BIG){if(msgctl(php_msg,IPC_RMID,0) == -1)  {  fprintf(stderr,"msgctl(IPC_RMID) failed \n");  }   }else if(errno == EINVAL){sleep(1);}}else{printf("recevier mssage : %s , type= %d\n", php_data.mtext, php_data.mtype);memset(data, '\0', MAX_MSG_LEN);memcpy(data, pre, strlen(pre));memcpy(data+strlen(pre), php_data.mtext, strlen(php_data.mtext));msg_send(php_msg1, 2, data);bzero(php_data.mtext, strlen(php_data.mtext));}//break;}free(data);}static int msg_send(int msg_id, int fd, char *data){struct msg_st some_data;//some_data = malloc( sizeof(struct msg_st) );memcpy(some_data.mtext, data, strlen(data) + 1);some_data.mtext[strlen(data)] = '\0';some_data.mtype= fd;printf("will send %s \n", &some_data.mtext);//int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); if((msgsnd(msg_id,(void *) & some_data, strlen(data), 0)) == -1){perror("msgsnd");return 0;}return 1;}

?

運行:./m

再運行:php msg_write.php

?

?

?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.