int main(int argc, char **argv){ int sockfd, len, new_sockfd; char buf[BUFSIZ]; //sockaddr_in構造体 <netinet/in.h>で定義されている struct sockaddr_in serv, clt; socklen_t sin_siz; unsigned short port; if(argc != 3){ printf("usage: progname ip port\n"); exit(EXIT_FAILURE); } //第1引数:IPv4で通信しますよ 第2引数:TCPで通信しますよ if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0){ err_func("socket"); } //ドメイン設定=IPv4という意味 serv.sin_family = PF_INET; //atoiは文字列を数値に変換 unsigned shortにキャスト port = (unsigned short)atoi(argv[2]); //htonsでネットワークバイトオーダに変換している serv.sin_port = htons(port); inet_aton(argv[1], &(serv.sin_addr)); sin_siz = sizeof(struct sockaddr_in); if(bind(sockfd, (struct sockaddr *)&serv, sin_siz) < 0){ err_func("bind"); } if(listen(sockfd, SOMAXCONN) < 0){ err_func("listen"); } while(1){ if((new_sockfd = accept(sockfd, (struct sockaddr *)&clt, &sin_siz)) < 0){ err_func("accept"); } printf("connect from %s : %u\n",inet_ntoa(clt.sin_addr),ntohs(clt.sin_port)); memset(buf, 0, BUFSIZ); while(strncmp(buf, "EXIT\r\n", 6) != 0 && strncmp(buf, "EXIT\n",5) != 0){ len = recv(new_sockfd,buf,BUFSIZ,0); buf[len] = 0x1a; printf("<- %s",buf); len = send(new_sockfd,buf,len,0); } close(new_sockfd); } close(sockfd); return 0; }
void Panorama::BA() { #define _KMAX 100 const float ep1 = 1.0E-15, tow = 1.0E-3; float mu = 0, rho, nu = 2.0; float errValue, errValueNew; /* A = J'*J; epNew = x-f(p); g = J'*ep; */ cal_JTJ(); cal_fp(pCur); x_minus_fp(); errValueNew = err_func(); cal_JTr(); /* stop if gradient is small */ if (*max_element(g, g+(numImgAdded<<2)) < ep1) { return; } /* mu = max(A_ii) * tow; */ { float *p = A; for (int i = 0; i < (numImgAdded<<2); i++){ if(*p > mu) { mu = *p; } p += (numImgAdded<<2) + 1; } mu *= tow; } for (int i = 0; i < _KMAX; ++i) { /* repeat */ do { /* solve (A+uC)*dp = g */ cal_A_plus_uC(); // TODO: INVERSE(); /* stop if delta is small */ if (norm2(dp) <= ep1 * norm2(pCur)) { return; } /* p_new = p + dp */ p_add_dp(); /* ep_new = x - f(p_new) */ cal_fp(pNew); x_minus_fp(); /* rho = blahblah */ rho = (errValue - errValueNew); if (rho > 0.0) { /* p = p_new */ std::swap(pCur, pNew); /* A = J'*J */ cal_JTJ(); /* ep = ep_new */ std::swap(ep, epNew); /* g = J' * ep*/ cal_JTr(); /* stop if gradient is small */ if (*max_element(g, g+(numImgAdded<<2)) < ep1) { return; } // we abate the error, so next iteration now nu = 2; mu *= 0.5; break; } else { mu *= nu; nu *= 2; } } while (true); } LM_Done: ; #undef _KMAX }