示例#1
0
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;
}
示例#2
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
}