?? main.cpp
字號:
/************************************************************************ * file name: main.cpp * description: SystemC module with UDP clientt and server, * compiled in linux. * * modification history * -------------------- * 04.4.7, created by zhuwei *//* includes----------------------------------------------------------- */#include "systemc.h"#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <sys/select.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <deque> // STL/* defines------------------------------------------------------------ */#define UDP_PORT 3456#define BUF_SIZE 128/* typedefs----------------------------------------------------------- */void send_data(void *data, int size);deque<int > buf(BUF_SIZE, 0);struct module_a: sc_module{ sc_in<bool> clk; int i, j; void reg_fun() { i++; if(i % 1000000 == 0) { j++; send_data((void *)&j, sizeof(int)); cout << name() << " send data: " << j << endl; } } SC_CTOR(module_a): j(245) { SC_METHOD(reg_fun); sensitive_pos << clk; }};struct module_b: sc_module{ sc_in<bool> clk; int data; void reg_fun() { if(!buf.empty()) { data = *buf.begin(); buf.pop_front(); cout << name() << " recv data: " << data << endl; } } SC_CTOR(module_b) { SC_METHOD(reg_fun); sensitive_pos << clk; }};/* externs------------------------------------------------------------ *//* globals------------------------------------------------------------ */char *dest_ip = "127.0.0.1";int sockfd;/* forward declarations----------------------------------------------- */void run_svr(void * p){ struct sockaddr_in local_addr; //----------------------------------- fd_set read_set; memset(&local_addr, 0 , sizeof(struct sockaddr)); local_addr.sin_family = AF_INET; local_addr.sin_port = htons(UDP_PORT); local_addr.sin_addr.s_addr = INADDR_ANY; if(bind(sockfd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr))!=0) fprintf(stderr, "error bind"); while(1) { //printf("wait to receive...\n"); FD_ZERO (&read_set); FD_SET(sockfd, &read_set); if(select(sockfd+1, &read_set, NULL, NULL, NULL) <= 0)continue; //--UDP recevie-- if (FD_ISSET (sockfd, &read_set)) { unsigned char buffer[1024]; int recv_size; int data; socklen_t addr_size = sizeof(struct sockaddr); while((recv_size = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&local_addr, &addr_size))>0) { memcpy(&data, buffer, sizeof(int)); //printf("%d\n", data); buf.push_back(data); } } }}void send_data(void *data, int size){ struct sockaddr_in dest_addr; int ret; memset(&dest_addr, 0 , sizeof(struct sockaddr)); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(UDP_PORT); dest_addr.sin_addr.s_addr = inet_addr(dest_ip); ret = sendto(sockfd, data, size, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); if(ret<0)fprintf(stderr, "error sending.\n");}int sc_main(int argc, char *argv[]){ sc_clock clk("clk", 1000, SC_NS); //sc_signal<int> data; //----------------------------- pthread_t svr_thrd; int ret; buf.clear(); sockfd = socket( AF_INET, SOCK_DGRAM, 0 ); if(sockfd < 0) fprintf(stderr, "error create socket\n"); module_a ma("ma"); ma(clk); module_b mb("mb"); mb(clk); ret = pthread_create(&svr_thrd, NULL, (void *(*) (void *))run_svr, /*(void *)&data*/ NULL); if(ret) { perror("pthread_create: run_svr"); exit(EXIT_FAILURE); } sc_start(-1); close(sockfd); return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -