質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

731閲覧

unionにてunknown type nameとuse of undeclared identifierと出る

nyamagoyaki

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/27 01:53

編集2021/05/27 02:40

C言語によるTCP/IPセキュリティプログラミング」という本を購入し、DNS自作プロキシを作成しているのですが、
下記画像の通り、unionにて2つのエラーが出てしまいました。

この本には、自作ライブラリを多く作成し使用しているので迷ってしまいました。

このエラーはどうしたら解決できるでしょうか?

C言語に詳しい方にご助言いただけたら幸いです。

イメージ説明

#include "inc.h" #include "base.h" /* •ø•§•‡•¢•¶•»ª˛¥÷(…√) */ #define TIMEOUT_SEC (30) #define TIMEOUT_SEC_U (5) /* •—•È•·°º•ø•’•°•§•Î•—•π */ #define PARAM_PATH "/etc/dnsproxy.ini" /* DNS•µ°º•–•«°º•ø */ #define DNS_SERVER_HOST "192.168.0.10" char DnsServerHost[512]=DNS_SERVER_HOST; #define DNS_SERVER_PORT "20053" char DnsServerPort[512]=DNS_SERVER_PORT; #define BIG(a,b) ((a)>=(b)?(a):(b)) /* •◊•Ì•»•ø•§•◊ */ static int MsgLogTcpQuery(JOB_DATA *job_data,char *buf,int size); static int MsgLogTcpResponse(JOB_DATA *job_data,char *buf,int size); static int MsgLogUdpQuery(JOB_DATA *job_data,char *buf,int size); static int MsgLogUdpResponse(JOB_DATA *job_data,char *buf,int size); static void do_timeout(int sig); static int set_timeout(int sec); static int reset_timeout(); /* •—•È•·°º•ø∆…§flπ˛§fl */ int ReadParam() { GetPrivateProfileString("DnsProxy","DnsServerHost",DNS_SERVER_HOST,DnsServerHost,sizeof(DnsServerHost),PARAM_PATH); GetPrivateProfileString("DnsProxy","DnsServerPort",DNS_SERVER_PORT,DnsServerPort,sizeof(DnsServerPort),PARAM_PATH); lprintf("DnsServer=%s:%s\n",DnsServerHost,DnsServerPort); return(0); } /* •◊•Ì•≠•∑ΩËÕ˝º¬π‘ */ int DoProxy(JOB_DATA *job_data) { int ret; int count=0; int width; struct timeval timeout; fd_set readOK; int end=0; char buf[4097]; set_timeout(TIMEOUT_SEC); job_data->soc_server=-1; strcpy(job_data->host,""); strcpy(job_data->port,""); job_data->soc_server=ClientSocket(DnsServerHost,DnsServerPort,-1); if(job_data->soc_server==-1){ lprintf("%s:%s§À¿‹¬≥§«§≠§ §§\n",DnsServerHost,DnsServerPort); return(-1); } while(1){ count++; /* select()Õ—•fi•π•Ø∫Ó¿Æ */ FD_ZERO(&readOK); FD_SET(job_data->soc,&readOK); width=job_data->soc+1; FD_SET(job_data->soc_server,&readOK); width=BIG(job_data->soc_server+1,width); timeout.tv_sec=32767; timeout.tv_usec=0; switch(select(width,&readOK,NULL,NULL,&timeout)){ case -1: if(errno!=EINTR){ lperror("select"); /* ≥‰§Íπ˛§fl∞ ≥∞§Œ•®•È°º§ŒæÏπÁ§œΩ™Œª */ end=1; } break; case 0: end=1; break; default: if(FD_ISSET(job_data->soc,&readOK)){ /* •Ø•È•§•¢•Û•»•Ï•«•£ */ /* •Ø•È•§•¢•Û•»§´§ÈºıøÆ */ ret=recv(job_data->soc,buf,sizeof(buf)-1,0); if(ret>0){ MsgLogTcpQuery(job_data,buf,ret); /* •µ°º•–§À¡˜øÆ */ SendSize(job_data->soc_server,buf,ret); } if(ret<=0){ end=1; } } if(FD_ISSET(job_data->soc_server,&readOK)){ /* •µ°º•–•Ï•«•£ */ /* •µ°º•–§´§ÈºıøÆ */ ret=recv(job_data->soc_server,buf,sizeof(buf)-1,0); if(ret>0){ MsgLogTcpResponse(job_data,buf,ret); /* •Ø•È•§•¢•Û•»§À¡˜øÆ */ SendSize(job_data->soc,buf,ret); } if(ret<=0){ end=1; } } break; } if(end){ break; } } if(job_data->soc_server!=-1){ /* •Ω•±•√•»•Ø•Ì°º•∫ */ SocketClose(job_data->soc_server); } /* •ø•§•‡•¢•¶•»•Í•ª•√•» */ reset_timeout(); return(0); } /* •Ì•∞Ω–Œœ¥ÿœ¢ */ static int MsgLogTcpQuery(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"TCP:Query(%s)[%d]<<<<<<<<<<\n",job_data->client_address,getpid()); log_out(msg,buf+2,size-2); return(0); } static int MsgLogTcpResponse(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"TCP:Response(%s)[%d]>>>>>>>>>>\n",job_data->client_address,getpid()); log_out(msg,buf+2,size-2); return(0); } static int MsgLogUdpQuery(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"UDP:Query(%s)[%d]<<<<<<<<<<\n",job_data->client_address,getpid()); log_out(msg,buf,size); return(0); } static int MsgLogUdpResponse(JOB_DATA *job_data,char *buf,int size) { char msg[512]; sprintf(msg,"UDP:Response(%s)[%d]>>>>>>>>>>\n",job_data->client_address,getpid()); log_out(msg,buf,size); return(0); } /* •◊•Ì•≠•∑ΩËÕ˝º¬π‘(UDP) */ int DoProxyU(JOB_DATA *job_data) { struct sockaddr_in from,to,server; struct in_addr addr; int fromlen,size,tolen,ret,size2; char adr[80]; union { HEADER hde; u_char buf[PACKETSZ]; }buf,buf2; set_timeout(TIMEOUT_SEC_U); /* •Ø•È•§•¢•Û•»§´§ÈºıøÆ */ fromlen=sizeof(from); size=recvfrom(job_data->soc,buf.buf,sizeof(buf),0,&from,&fromlen); if(size<=0||size>512){ return(-1); } strcpy(job_data->client_address,inet_ntoa(from.sin_addr)); MsgLogUdpQuery(job_data,buf.buf,size); if(buf.hde.qr==1){ /*  ÷≈˙§ŒæÏπÁ:¡˜øƧŒ§fl */ job_data->soc_server=ClientSocketU(DnsServerHost,DnsServerPort,-1,&to,&tolen); if(job_data->soc_server==-1){ lprintf("%s:%s§À¿‹¬≥§«§≠§ §§\n",DnsServerHost,DnsServerPort); return(-1); } ret=sendto(job_data->soc_server,buf.buf,size,0,&to,tolen); strcpy(adr,inet_ntoa(from.sin_addr)); SocketClose(job_data->soc_server); return(1); } else{ /* ɧ§πÁ§Ô§ª§ŒæÏπÁ */ if(atoaddr(DnsServerHost,&addr)==0){ lprintf("atoaddr():error\n"); return(-1); } memset((char *)&server,0,sizeof(server)); server.sin_family=AF_INET; server.sin_port=atoport(DnsServerPort,"udp"); server.sin_addr=addr; _res.nscount=1; memcpy(&_res.nsaddr_list[0],&server,sizeof(struct sockaddr_in)); _res.options&=~RES_RECURSE; _res.retry=1; /* •µ°º•–§Àɧ§πÁ§Ô§ª¡˜øÆ°¶±˛≈˙ºıøÆ */ size2=res_send(buf.buf,size,buf2.buf,PACKETSZ); MsgLogUdpResponse(job_data,buf2.buf,size2); if(size2<=0){ return(-1); } if(buf.hde.id!=buf2.hde.id){ return(-1); } /* •Ø•È•§•¢•Û•»§À±˛≈˙ */ ret=sendto(job_data->soc,buf2.buf,size2,0,&from,fromlen); return(0); } } /* •ø•§•‡•¢•¶•»ΩËÕ˝¥ÿœ¢ */ static void do_timeout(int sig) { exit(0); } static int set_timeout(int sec) { signal(SIGALRM,do_timeout); alarm(sec); return(0); } static int reset_timeout() { alarm(0); return(0); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/05/27 02:07

コードを提示していただかないと何もわかりません。
guest

回答2

0

先に

warning: illegal character encoding in string literal

を直したほうが良いかと思います。

投稿2021/05/27 06:52

jimbe

総合スコア12744

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

HEADER とか PACKETSZ とかいうのがコード内に唐突に出てきているので,
「何すかソレ?」と言われているだけですよね.

これらの定義が書かれている何らかのヘッダが存在するのではないでしょうか?

投稿2021/05/27 02:54

fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問