#困っている点。
C++のtypeid().name()という関数を使用して変数の型を確認したところ、"P1m"という名前の型が出力されました。
しかし、インターネットで"C++ P1m"と検索してもP1mに関する情報が得られませんでした。
そこで、P1mという型について詳しく教えてください。
有識者の方々、ご助力お願いします。
#ソースコード
以下にソースコードがあるgithubのリンクを示します。
https://github.com/yzaki/verus
本コードは、上記のページの/src/verus_client.cppというファイルになります。
また、typeid().name()の出力は下記のコードの90行目で行っています。
cpp
1#include "verus.hpp" 2 3int len_inet; // length 4int s,err; 5 6char* port; 7char* srvr_addr; 8unsigned int delay = 0; 9 10bool receivedPkt = false; 11bool terminate = false; 12 13struct sockaddr_in adr_srvr; 14struct sockaddr_in adr_srvr2; 15struct sockaddr_in adr; 16 17pthread_t timeout_tid; 18pthread_t sending_tid; 19 20typedef struct { 21 udp_packet_t *pdu; 22 long long seconds; 23 long long millis; 24} sendPkt; 25 26std::vector<sendPkt*> sendingList; 27pthread_mutex_t lockSendingList; 28 29boost::asio::io_service io; 30boost::asio::deadline_timer timer (io, boost::posix_time::milliseconds(SS_INIT_TIMEOUT)); 31 32static void displayError(const char *on_what) { 33 fputs(strerror(errno),stderr); 34 fputs(": ",stderr); 35 fputs(on_what,stderr); 36 fputc('\n',stderr); 37 exit(1); 38} 39 40void TimeoutHandler( const boost::system::error_code& e) { 41 int z; 42 43 if (e) return; 44 45 z = sendto(s,"Hallo", strlen("Hallo"), 0, (struct sockaddr *)&adr_srvr2, len_inet); 46 if ( z < 0 ) 47 displayError("sendto(Hallo)"); 48 49 //update timer and restart 50 timer.expires_from_now (boost::posix_time::milliseconds(1000)); 51 timer.async_wait(&TimeoutHandler); 52 53 return; 54} 55 56void* sending_thread (void *arg) 57{ 58 int s1, z; 59 struct timeval timestamp; 60 sendPkt *pkt; 61 62 memset(&adr_srvr,0,sizeof adr_srvr); 63 64 adr_srvr2.sin_family = AF_INET; 65 adr_srvr2.sin_port = htons(atoi(port)); 66 adr_srvr2.sin_addr.s_addr = inet_addr(srvr_addr); 67 68 if ( adr_srvr2.sin_addr.s_addr == INADDR_NONE ) { 69 displayError("bad address."); 70 } 71 72 s1 = socket(AF_INET,SOCK_DGRAM,0); 73 if ( s1 == -1 ) { 74 displayError("socket()"); 75 } 76 77 while (!terminate) { 78 gettimeofday(×tamp,NULL); 79 80 pthread_mutex_lock(&lockSendingList); 81 82 if (sendingList.size() > 0) 83 pkt = * sendingList.begin(); 84 85 // since tc qdisc command in Linux seems to have some issues when adding delay, we defer the packet here 86 if (sendingList.size() > 0 && (timestamp.tv_sec-pkt->seconds)*1000.0+(timestamp.tv_usec-pkt->millis)/1000.0 > delay) { 87 // sending ACK 88 z = sendto(s1, pkt->pdu, sizeof(udp_packet_t), 0, (struct sockaddr *)&adr_srvr2, len_inet); 89 // ここで出力している。 90 std::cout << typeid(pkt->pdu).name() << "\n"; 91 free (pkt->pdu); 92 93 if (z < 0) 94 if (errno == ENOBUFS || errno == EAGAIN || errno == EWOULDBLOCK) 95 std::cout << "reached maximum OS UDP buffer size\n"; 96 else 97 displayError("sendto(2)"); 98 99 sendingList.erase(sendingList.begin()); 100 pthread_mutex_unlock(&lockSendingList); 101 } 102 else{ 103 pthread_mutex_unlock(&lockSendingList); 104 usleep(0.01); 105 } 106 } 107 108 return NULL; 109} 110 111void* timeout_thread (void *arg) 112{ 113 boost::asio::io_service::work work(io); 114 115 timer.expires_from_now (boost::posix_time::milliseconds(SS_INIT_TIMEOUT)); 116 timer.async_wait(&TimeoutHandler); 117 io.run(); 118 119 return NULL; 120} 121 122int main(int argc,char **argv) { 123 int z; 124 int i = 1; 125 char command[512]; 126 char tmp[512]; 127 128 udp_packet_t *pdu; 129 sendPkt *pkt; 130 struct timeval timestamp; 131 setbuf(stdout, NULL); 132 std::ofstream clientLog; 133 134 pthread_mutex_init(&lockSendingList, NULL); 135 136 if (argc < 4) { 137 std::cout << "syntax should be ./verus_client <server address> -p <server port> [-d <additional link delay in ms>] \n"; 138 exit(0); 139 } 140 141 srvr_addr = argv[1]; 142 143 while (i != (argc-1)) { // Check that we haven't finished parsing already 144 i=i+1; 145 if (!strcmp (argv[i], "-p")) { 146 i=i+1; 147 port = argv[i]; 148 } else if (!strcmp (argv[i], "-d")) { 149 i=i+1; 150 delay = atoi(argv[i]); 151 }else { 152 std::cout << "syntax should be ./verus_client <server address> -p <server port> [-d <additional link delay in ms>] \n"; 153 exit(0); 154 } 155 } 156 157 memset(&adr_srvr,0,sizeof adr_srvr); 158 159 adr_srvr.sin_family = AF_INET; 160 adr_srvr.sin_port = htons(atoi(port)); 161 adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr); 162 163 if ( adr_srvr.sin_addr.s_addr == INADDR_NONE ) { 164 displayError("bad address."); 165 } 166 167 len_inet = sizeof adr_srvr; 168 169 s = socket(AF_INET,SOCK_DGRAM,0); 170 if ( s == -1 ) { 171 displayError("socket()"); 172 } 173 174 std::cout << "Sending request to server \n"; 175 176 //printf("Sending Hallo to %s:%s\n", srvr_addr, port); 177 z = sendto(s,"Hallo", strlen("Hallo"), 0, (struct sockaddr *)&adr_srvr, len_inet); 178 if ( z < 0 ) 179 displayError("sendto(Hallo)"); 180 181 if (pthread_create(&(timeout_tid), NULL, &timeout_thread, NULL) != 0) 182 std::cout << "can't create thread: " << strerror(err) << "\n"; 183 184 if (pthread_create(&(sending_tid), NULL, &sending_thread, NULL) != 0) 185 std::cout << "can't create thread: " << strerror(err) << "\n"; 186 187 188 // starting to loop waiting to receive data and to ACK 189 while(!terminate) { 190 pdu = (udp_packet_t *) malloc(sizeof(udp_packet_t)); 191 192 socklen_t len = sizeof(struct sockaddr_in); 193 z = recvfrom(s, pdu, sizeof(udp_packet_t), 0, (struct sockaddr *)&adr, &len); 194 if ( z < 0 ) 195 displayError("recvfrom(2)"); 196 197 if (pdu->ss_id < 0) { 198 clientLog.close(); 199 terminate = true; 200 } 201 202 // stopping the io timer for the timeout 203 if (!receivedPkt) { 204 sprintf (command, "client_%s.out", port); 205 clientLog.open(command); 206 receivedPkt = true; 207 io.stop(); 208 std::cout << "Connected to server \n"; 209 } 210 211 gettimeofday(×tamp,NULL); 212 sprintf(tmp, "%ld.%06d, %llu\n", timestamp.tv_sec, timestamp.tv_usec, pdu->seq); 213 clientLog << tmp; 214 215 pkt = (sendPkt *) malloc(sizeof(sendPkt)); 216 pkt->pdu = pdu; 217 pkt->seconds = timestamp.tv_sec; 218 pkt->millis = timestamp.tv_usec; 219 220 pthread_mutex_lock(&lockSendingList); 221 sendingList.push_back(pkt); 222 pthread_mutex_unlock(&lockSendingList); 223 224 } 225 226 std::cout << "Client exiting \n"; 227 close(s); 228 return 0; 229} 230
回答3件
あなたの回答
tips
プレビュー