httpクライアントにてURLをプログラム内に記入する方法

このQ&Aのポイント
  • httpクライアントを利用したプログラムで、URLをプログラム内に記入して実行する方法について教えてください。
  • 質問文章のプログラムの一部を記入して、URLをプログラム内に記入する方法について説明してください。
  • httpクライアントを使ってURLをプログラム内に記入して実行する方法について詳しく教えてください。
回答を見る
  • ベストアンサー

httpクライアントにて

httpクライアントを利用したプログラムで、実行の際にURLを入力するようにできているのですが、URLをプログラム内に記入して、実行だけで済むようにするにはどこを変更したらよいのでしょうか? 以下プログラムの一部を記入しておきます。 #include <stdio.h> #include <string.h> #include <winsock.h> #pragma comment(lib,"ws2_32.lib") #define BUFSIZE 256/* バッファサイズ */ #define RECVSIZE 4096/* 受信バッファサイズ */ int main(int argc,char **argv) { WORD wVersionRequested; int nErrorStatus; WSADATA wsaData; char svName[BUFSIZE]; /* サーバのドメイン名 */ char html[BUFSIZE]; /* 取得するページのパス */ unsigned short port = 80; /* ポート番号 */ int soc; /* ソケット(Soket Descriptor) */ unsigned long serveraddr; /* サーバのIPアドレス */ struct hostent *serverhostent; /* サーバの情報を指すポインタ */ struct sockaddr_in serversockaddr; /* サーバのアドレス */ char sendbuf[BUFSIZE]; /* 送信バッファ */ char recvbuf[RECVSIZE]; /* 受信バッファ */ int buf_len; /* 受信したバイト数 */ char *p,*r,*t,wk[8]; /* 作業用領域 */ int i; FILE *file; file = fopen("tenki.txt","w"); /* スキーム名を取得する */ for(i = 0;i < 7;i++){ wk[i] = argv[1][i]; } wk[i] = '\0'; if(strcmpi(wk,"http://") != 0){ fprintf(stderr,"Error: httpのURLではありません\n"); return -1; } /* サーバ名を取得する */ for(p = argv[1] + i,r = svName;*p != '/' && *p != '\0';p++,r++){ *r = *p; } *r = '\0'; /* 取得するページのパスを取得する */ for(r = html;*p != '\0';p++,r++){ *r = *p; } *r = '\0'; /* サーバ名:ポート となっている場合は分割する */ for(p = svName;*p != ':' && *p != '\0';p++); if(*p == ':'){ for(t = p + 1,r = wk;*t != '\0';t++,r++){ *r = *t; } *r = '\0'; port = (unsigned short)atoi(wk); *p = '\0'; } /* ページの指定が無い場合は、/ (ルート)を設定する */ if(strcmp(html,"") == 0){ strcpy(html,"/"); } /* WinSockの初期化を行う */ wVersionRequested = MAKEWORD(1,1); /* バージョン 1.1 を要求する */ nErrorStatus = WSAStartup(wVersionRequested, &wsaData); if(atexit((void (*)(void))(WSACleanup))){ /* 終了時にWinSockのリソースを解放するようにしておく */ fprintf(stderr,"Error: atexit(WSACleanup)失敗\n"); return -1; } if(nErrorStatus != 0){ fprintf(stderr,"Error: WinSockの初期化失敗\n"); return -1; } /* socにソケットを作成します */ soc = socket(PF_INET,SOCK_STREAM,0); if(soc == INVALID_SOCKET){ fprintf(stderr,"Error: Socket作成失敗\n"); return -1; } /* svNameにドットで区切った10進数のIPアドレスが入っている場合、serveraddrに32bit整数のIPアドレスが返ります */ serveraddr = inet_addr((char*)svName); if(serveraddr == -1) { /* サーバ名(svName)からサーバの情報を取得します */ serverhostent = gethostbyname(svName); if(serverhostent == NULL) { fprintf(stderr,"Error: ホストアドレス取得失敗\n"); /* ソケットを破棄する */ closesocket(soc); return -1; }else{ /* サーバの情報からIPアドレスをserveraddrにコピーします */ serveraddr = *((unsigned long *)((serverhostent->h_addr_list)[0])); } } /* サーバのアドレスの構造体にサーバのIPアドレスとポート番号を設定します */ serversockaddr.sin_family = AF_INET; /* インターネットの場合 */ serversockaddr.sin_addr.s_addr = serveraddr; /* サーバのIPアドレス */ serversockaddr.sin_port = htons((unsigned short)port); /* ポート番号 */ memset(serversockaddr.sin_zero,(int)0,sizeof(serversockaddr.sin_zero)); /* サーバへ接続します */ if(connect(soc,(struct sockaddr *)&serversockaddr,sizeof(serversockaddr)) == SOCKET_ERROR){ fprintf(stderr,"Error: サーバへの接続失敗\n"); /* ソケットを破棄する */ closesocket(soc); return -1; }

  • nipa-
  • お礼率22% (2/9)

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

なるほど。それなら何とかなります。 手順としては、 (1)起動パラメータからURLを取得して加工している部分を抹消します。 /* スキーム名を取得する */から/* WinSockの初期化を行う */の手前までを消してください。 (2)直接定義に書き換えます。 例えば、http://dir.yahoo.co.jp/Entertainment/に接続するとすると。 char svName[BUFSIZE]; /* サーバのドメイン名 */ char html[BUFSIZE]; /* 取得するページのパス */ を char svName[] = "dir.yahoo.co.jp": char html[] = "/Entertainment/"; です。 これで動くはずです。問題とか、コンパイルエラーとか、疑問があればまた聞いてください。あとは使わなくなった変数を消しといてくださいね。

nipa-
質問者

お礼

本当にありがとうございます! エラーなくコンパイル、実行できたので大丈夫でした。

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

あっセミコロンとコロンを打ち間違えました。 char svName[] = "dir.yahoo.co.jp"; char html[] = "/Entertainment/"; が正解です。

nipa-
質問者

お礼

ありがとうございます! エラーもなく無事にコンパイルと実行ができました。 本当にありがとうございます!

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

>別のプログラムと併用して、HTMLの内容をテキストに書き出してその結果を利用するプログラムを作成予定です。 と言うことは、ホームページのターゲットは特定しないんでしょうか? 日本のホームページがターゲットなら文字コードは、SJIS/JIS/EUC/UTF-8などの種類を自動判定しないとまともにテキスト化もできません。 それとHTMLをどこまで解析するかで難易度も変わってきますね。文字列の処理は苦手なC言語でHTMLワードの検索を行うのはかなり困難なので、正規表現ライブラリの利用も考えなくてはいけません。リンク先を探し出すことさえ、標準ライブラリではかなり面倒です あと残り何日なのかが分かりませんが、そんな難しい課題なんでしょうか? 差し支えない範囲で課題を内容を教えてください。 あえて難しい挑戦をしている可能性もありますよ。

nipa-
質問者

補足

ホームページは特定しています。 今の状態でテキスト化は上手くできているようなので(一応ですが)そこは大丈夫です。 今のところ、プログラム1・プログラム2・プログラム3がありまして、(以下pr1・pr2・pr3と書きます) pr1は主なプログラム。簡単に言うと、色々なことを話すプログラムのようなものです。 pr2は今回質問しているプログラム。htmlのソースを受信します。 pr3はpr2で受信して情報を記入したテキストの一部を別のテキストに書き出すプログラム (例えば、pr2で書き出したテキストが「こんにちは、私は鈴木です」とあるとすると、pr3で「鈴木」を抜き出して別のテキストに書き出すようなもの) です。 最終的に1つのプログラムにまとめるので、今回のpr2のように実行する際にURLを打ち込まないといけない状態だとまとめれないので困っている状態です。 ちなみに現在pr1,pr2,pr3の動作はエラーも起きず上手く動いています。 あと約3週間あります!おそらく難しいと言うより私の知識不足が大きいと思われます。。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

このプログラムを改造して何をしたいのでしょうか? どこかのホームページのHTMLの内容をテキストとして表示したいだけでしょうか?それならブラウザでやった方が早いですよ。 コード変換も無いですし、改行コードも気にしてませんし、そのまま使うには色々と問題がありそうですが。 URLをプログラムに埋め込むのは難しくありませんが、それ以上のこととなると初心者には難しすぎると思いますが。

nipa-
質問者

補足

別のプログラムと併用して、HTMLの内容をテキストに書き出してその結果を利用するプログラムを作成予定です。 問題が色々とあるのですか。 夏の期間の課題なのですが初心者にはやはり辛いですね。。。

回答No.1

自分で作ったんじゃないんですか? どこまで自分で試してみたのか教えてください。

nipa-
質問者

補足

どこかのサイトにあったhttpクライアントを使って ちょっとだけいじってるだけです。 上のほうにある”スキーム名を・・・” のところをいじってもコンパイルできなかったです。

関連するQ&A

  • HTTPクライアントの作成について

    下のc言語で書かれたプログラムソースは、とあるHPにあったものです。受信して表示するだけですが、実際にコンパイルもでき動作も確認しています。仕組みも大体は理解しているつもりです。このプログラムを改造して、リンクのURLの一覧のみ表示させるには、どのように改造すればよいのでしょうか?それとも、根本的に仕組みが異なるのでしょうか?詳しくご指導いただけるとありがたいです。そのHPのURLものせておきます。よろしくお願いします。 URL:http://x68000.q-e-d.net/~68user/net/c-http-1.html ※includeは省略しています。 #define BUF_LEN 256 /*バッファのサイズ */ int main(int argc, char *argv[]){ int s; /*ソケットのためのファイルディスクリプタ */ struct hostent *servhost; /*ホスト名と IP アドレスを扱うための構造体 */ struct sockaddr_in server; /*ソケットを扱うための構造体 */ struct servent *service; /*サービス (http など) を扱うための構造体 */ char send_buf[BUF_LEN]; /* サーバに送るHTTP プロトコル用バッファ */ char host[BUF_LEN] = "localhost"; /*接続するホスト名 */ char path[BUF_LEN] = "/"; /*要求するパス */ unsigned short port = 0; /*接続するポート番号 */ if ( argc > 1 ){ /*URLが指定されていたら */ char host_path[BUF_LEN]; if ( strlen(argv[1]) > BUF_LEN -1 ){ fprintf(stderr, "URL が長すぎます。\n"); return 1; } /*http:// から始まる文字列で */ /*sscanf が成功して */ /*http:// の後に何か文字列が存在するなら */ if ( strstr(argv[1], "http://") && sscanf(argv[1], "http://%s", h ost_path) && strcmp(argv[1], "http://") ){ char *p; p = strchr(host_path, '/'); /* ホストとパスの区切り "/" を調べる */ if ( p != NULL ){ strcpy(path, p);/*"/"以降の文字列を path にコピー */ *p = '\0'; strcpy(host, host_path ); /*"/"より前の文字列を host にコピー */ } else {/*"/"がないなら=http://host という引数なら */ strcpy(host, host_path); /*文字列全体を host にコピー */ } p = strchr(host, ':'); /*ホスト名の部分に ":" が含まれていたら */ if ( p != NULL ){ port = atoi(p+1); /*ポート番号を取得 */ if ( port <= 0 ){ /*数字でない (atoi が失敗)か、0だったら */ port = 80; /*ポート番号は 80 に決め打ち */ } *p = '\0'; } } else { fprintf(stderr, "URLはhttp://host/path の形式で指定してください。\n"); return 1; } } printf("http://%s%s を取得します。\n\n",host, path); /* ホストの情報(IPアドレスなど)を取得 */ servhost = gethostbyname(host); if ( servhost == NULL ){ fprintf(stderr, "[%s] から IPアドレスへの変換に失敗しました。\n", host); return 0; } bzero(&server, sizeof(server));  /* 構造体をゼロクリア */ server.sin_family = AF_INET; /* IPアドレスを示す構造体をコピー */ bcopy(servhost->h_addr, &server.sin_add r,servhost->h_length); if ( port != 0 ){/* 引数でポート番号が指定されていたら */ server.sin_port = htons(port); } else {/* そうでないなら getservbyname でポート番号を取得 */ service = getservbyname("http", "tcp"); if ( service != NULL ){  /* 成功したらポート番号をコピー */ server.sin_port = service->s_port; } else { /* 失敗したら 80 番に決め打ち */ server.sin_port = htons(80); } } /* ソケット生成 */ if ( ( s = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){ fprintf(stderr, "ソケットの生成に失敗しました。\n"); return 1; } /* サーバに接続 */ if ( connect(s, (struct sockaddr *)&ser ver, sizeof(server)) == -1 ){ fprintf(stderr, "connectに失敗しました。\n"); return 1; } /* HTTP プロトコル生成 & サーバに送信 */ sprintf(send_buf, "GET %s HTTP/1.0\r\n" , path); write(s, send_buf, strlen(send_buf)); sprintf(send_buf, "Host: %s:%d\r\n", ho st, port); write(s, send_buf, strlen(send_buf)); sprintf(send_buf, "\r\n"); write(s, send_buf, strlen(send_buf)); /* あとは受信して、表示するだけ */ while (1){ char buf[BUF_LEN]; int read_size; read_size = read(s, buf, BUF_LEN); if ( read_size > 0 ){ write(1, buf, read_size); } else { break; } } /* 後始末 */ close(s); return 0; }

  • C言語の質問です

    #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } このプログラムをグレースケール化のプログラムに修正してください お願いします

  • 多次元配列の new 2

    追加の質問ですみません^^; char の8個の配列へのポインタの配列を new する場合などは、以下のサンプルのように typedef しないとかけないんでしょうかね?たとえば、  char (**bb)[8] = new (char (*)[8])[8]; 書きたいように思いますが、これは文法違反ですし・・・^^; ==== サンプル:(iostream の初期化時に、定義した new が呼び出されるかもしれないことを一応考慮して、stdio の関数を使っています^^) #include <new> #include <stdlib.h> #include <stdio.h> void *operator new(std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new(): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete(void *p) { fprintf(stderr, "::delete(): %p\n", p); if (p) free(p); } void *operator new[](std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new[](): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete[](void *p) { fprintf(stderr, "::delete[](): %p\n", p); if (p) free(p); } int main() { typedef char (*T)[8]; char (**b)[8] = new T[8]; delete[] b; } ==== % ./a.exe ::new[](): 0x6e01b0 32 ::delete[](): 0x6e01b0

  • カラー画像からグレースケール画像フォーマットの変換

    カラー画像からグレースケール画像フォーマットの変換するプログラムなんですが、いまいち理解できていません。 プログラムはRGB構造体を使ってのものなんですが添削お願いいたします。 #include<stdio.h> #include<stdlib.h> typedef struct _RGB { unsigned char r; unsigned char g; unsigned char b; } RGB; int main(int argc, char *argv[]) { int x, y; unsigned char *in, *out; int i, j, Magic, level; unsigned char tmp[255]; RGB **pixels; int width = 255; int height = 255; int size = width * height; FILE *fin, *fout; if(argc != 3){ printf("Usage : %s input outpu \n", argv[0]); exit(1); } fin = fopen(argv[1], "rb"); fgets(tmp, 255, fin); if(tmp[0] != 'P'){ return 0; } sscanf(tmp, "P%d", &Magic); if(Magic < 1 || Magic > 6){ return 0; } do{ fgets(tmp, 255, fin); } while(tmp[0] == '#'); sscanf(tmp, "%d %d", &x, &y); if(x < 1 || y < 1){ return 0; } fgets(tmp, 255, fin); sscanf(tmp, "%d", &level); printf("P%d\n", &Magic); printf("%d %d\n", x, y); printf("%d\n", level); in = (unsigned char *)malloc(sizeof(unsigned char) *x*y); fread(in, sizeof(unsigned char), x*y, fin); pixels = (RGB**)malloc(width*sizeof(RGB*)); pixels[0] = (RGB* )malloc(size * sizeof(RGB)); for(i = 1; i < width; i++){ pixels[i] = pixels[i - 1] + height; } free(pixels[0]); for(i = 1; i < width * height * 3; i++){ out[i] = pixels[i][0].r * 0.299 + pixels[i][1].g * 0.587 + pixels[i][2].b * 0.114; } fout = fopen(argv[2], "wb"); fprintf(fout,"P%d\n",Magic); fprintf(fout,"# My new PGM\n"); fprintf(fout,"%d %d\n",x, y); fprintf(fout,"%d\n",level); fwrite(out, sizeof(unsigned char),x*y, fout); free(pixels); free(in); free(out); free(fin); free(fout); }

  • ソケット通信で大容量のメールの場合送信されません

    質問です smtpクライアントからtcpでメール送信するプログラムを組んだのですが、 添付ファイルのサイズが大きいもの(500000行を超えるような)を1行ずつsendメソッドで送信すると送信先で受信できません。 400000行まではいくのですが… sendではエラーは返っておらずパケットは送られてる様です。 パケットダンプをとってみたのですが、メールサーバから応答は返ってきていました。 filein.open("test.eml"); if (filein.fail()){ return -1; } if((soc = ConnectHost("testhost","smtp",25)) == -1){ return -1; } send_buf = new char[BUFSIZ]; sprintf(send_buf,"MAIL FROM:<%s>\r\n","test@test.test"); SocketSend(soc,send_buf,strlen(send_buf)); sprintf(send_buf,"RCPT TO:<%s>\r\n","test2@test.test"); SocketSend(soc,send_buf,strlen(send_buf)); sprintf(send_buf,"DATA\r\n"); SocketSend(soc,send_buf,strlen(send_buf)); ss = new char[1024]; while (filein.getline(ss,1024)){ sprintf(send_buf,"%s\r\n",ss); SocketSend(soc,send_buf,strlen(send_buf)); ←ここでループ } delete ss; sprintf(send_buf,"\r\n.\r\n"); SocketSend(soc,send_buf,strlen(send_buf)); SocketRead(soc,send_buf); delete send_buf; filein.close(); if(SocketClose(soc) == -1){ return err; } int SocketSend(int soc,char* buff,int nbytes) { register int nleft,nwritten; char* p = buff; nleft = nbytes; while(nleft > 0) { nwritten = send(soc,p,nleft,0); if(nwritten <= 0){ return nwritten; } nleft -= nwritten; p += nwritten; } return 0; } int SocketClose(int soc) { int ret; if(close(soc) == -1){ return -1; } return 0; } int SocketRead(int soc,char* buff) { int rbyte; rbyte = read(soc,buff,strlen(buff)); return 0; } 上記で問題になっていそうなところがあれば 教えてください。。 よろしくお願いします。

  • C言語で作成するチャットについて

    LinuxでC言語のチャットプログラムを作成しています。プログラムを作ってみましたがうまく動きません。悪い個所が分からないのでお力を貸して頂きたいです課題の提出が迫っているので、よろしくお願いいたします。 <server> #include省略 #define PORT 5320 char *show_ip(char *ip_address); int main(void){ int soc, acc, size, child[3],width,i,count,pos,ret; char buffer[80]; struct sockaddr_in client, server; struct sockaddr_storage from; struct hostent *server_host; socklen_t len; fd_set mask; char host_name[257]; int temp; memset(host_name, 0, sizeof(host_name)); gethostname(host_name, 256); server_host = gethostbyname(host_name); printf("\n-------- informations of server ----------\n"); printf("Host name:%s\n", host_name); printf("IP = %s\n", show_ip(server_host->h_addr)); printf("\n\n"); soc = socket(AF_INET, SOCK_STREAM, 0); memset((char *)&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(PORT); bind(soc, (struct sockaddr *)&server, sizeof(server)); size = sizeof(client); listen(soc, 5); for (i = 0; i < 3; i++){ child[i] = -1; } for (;;) { FD_ZERO(&mask); FD_SET(soc, &mask); for (i = 0; i < 3; i++) { if (child[i] != -1){ FD_SET(child[i], &mask); if(child[i]+1 > width){ width = child[i]+1; } } } switch(select(soc+1, (fd_set *) &mask, NULL, NULL, NULL)) { case -1: perror("select"); break; case 0: break; default: if (FD_ISSET(soc, &mask)){ len = (socklen_t) sizeof(from); if((acc = accept(child[i], (struct sockaddr *)&from, &len)) == -1){ if(errno != EINTR){ perror("accept"); } }else{ if(child[0]&&child[1]&&child[2]!=-1){ fprintf(stderr,"child is full : cannot accept\n"); close(acc); }else{ if(child[0] == -1){ child[0] = acc; }else if(child[1] == -1){ child[1] = acc; }else{ child[2] = acc; } } } } for(i=0;i<3;i++){ if(child[i]!=-1){ if(FD_ISSET(child[i],&mask)){ memset(buffer, '\0', sizeof(buffer)); recv(child[i], buffer, 80, 0); printf("%s> ", show_ip((char *)&client.sin_addr)); printf("%s", buffer); if(strncmp(buffer, "exit", 4) == 0) break; for(i=0;i<3;i++) { send(child[i],show_ip((char *)&client.sin_addr),80,0); send(child[i],buffer,80,0); close(child[i]); } (void) close(child[i]); child[i] = -1; } } break; } } } } char *show_ip(char *ip_address){ static char ip[7]; char ipnum[4]; bcopy(ip_address, ipnum, 4); sprintf(ip, "%u.%u.%u.%u",(unsigned char)ipnum[0], (unsigned char)ipnum[1], (unsigned char)ipnum[2],(unsigned char)ipnum[3]); return ip; } <client> #include省略 #define STDIN_FD 0 #define PORT 5320 int select_func(int sockfd); void err_func(char *msg){ perror(msg); exit(EXIT_FAILURE); } int main(int argc, char **argv){ int sockfd, len; char buf[BUFSIZ]; struct sockaddr_in serv; unsigned short port; if(argc != 3){ printf("usage: progname serv_ip serv_port\n"); exit(EXIT_FAILURE); } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_func("socket"); serv.sin_family = PF_INET; port = (unsigned short)atoi(argv[2]); serv.sin_port = htons(port); inet_aton(argv[1], &(serv.sin_addr)); if(connect(sockfd, (struct sockaddr *)&serv, sizeof(struct sockaddr_in)) < 0) err_func("connect"); do{ if(select_func(sockfd) == 0){ len = recv(sockfd, buf, BUFSIZ, 0); buf[len] = '\0'; printf("-> %s\n", buf); }else{ len = read(STDIN_FD, buf, BUFSIZ); len = send(sockfd, buf, len, 0); } }while(strncmp(buf, "EXIT\r\n", 6) != 0 && strncmp(buf, "EXIT\n", 5) != 0); close(sockfd); return 0; } int select_func(int sockfd){ fd_set rfds; FD_ZERO(&rfds); FD_SET(sockfd, &rfds); FD_SET(STDIN_FD, &rfds); if(select(sockfd+1, &rfds, NULL, NULL, NULL) < 0) err_func("select"); if(FD_ISSET(STDIN_FD, &rfds)) return STDIN_FD; return sockfd; }

  • TCP/IP通信型大文字・小文字変換プログラム

    TCP/IP通信型大文字・小文字変換プログラムを作りたいです。 しかし、うまく2つのプログラムが接続されません。 恐らく、IPアドレスやホスト名の問題だと思います。 超初心者でそこのところをあまり理解していません。 どなたかプログラムの補足をお願いします。 概要は ・クライアント キーボードから文字列を入力し、サーバーに送信。 サーバーから送信された文字列を画面に出力。 ・サーバー クライアントから送信された文字列に対し、 大文字は小文字に、小文字は大文字に変換して返す。 クライアント側プログラム #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #define SOCK_NAME "./socket" int main() { struct sockaddr_in saddr; int soc; char buf[1024]; if ( (soc =socket(AF_INET, SOCK_STREAM, 0 ) ) < 0 ) { perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=inet_addr("192.168.1.1"); saddr.sin_port=htons(1357); if(connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("connect"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", soc); while(fgets(buf, 1024, stdin)){ if(buf[strlen(buf) -1] == "\n") buf[strlen(buf) -1] = "\0"; write(soc, buf, 1024); read(soc, buf, 1024); fprintf(stdout, "%s\n", buf); } close(soc); return 0; } サーバー側プログラム #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define SOCK_NAME "./socket" int main() { int i; int fd1, fd2; struct sockaddr_in saddr; struct sockaddr_in caddr; int len; int ret; char buf[1024]; if((fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(1357); unlink(SOCK_NAME); if(bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(1); } if(listen(fd1,5) < 0 ) { perror("listen"); exit(1); } while(1){ len = sizeof(caddr); if((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0){ perror("accept"); exit(1); } fprintf(stderr, "Connection established: socket %d used.\n", fd2); while((ret = read(fd2, buf, 1024)) > 0 ){ fprintf(stderr, "read: &s\n", buf); for(i=0; i<ret; i++) if(islower(buf[i])) buf[i] = toupper(buf[i]); if(isupper(buf[i])) buf[i] = tolower(buf[i]); fprintf(stderr, "write: %s\n", buf); write(fd2, buf, 1024); } close(fd2); } close(fd1); return 0; }

  • 「動的確保した2次元配列のメモリ解放」を関数化したい

    質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

  • c言語で任意のファイルから読み込んだ単語の数をカウントする

    c言語で任意のファイルから読み込んだ単語の数をカウントする 任意のファイルを読み込んだプログラムに、読み込んだ単語の数をカウントするプログラムを追加する課題が出ました。 条件は単語は空白で区切って1単語とする。改行も考慮に入れる。 関数を定義してポインタを使うらしいのですが検討がつきません。 下のプログラムでファイルを読み込むところまでは出来ています。 どうかご教授おねがいします;; #include <stdio.h> int main(int argc, char *argv[]) { FILE *myFile; int i=0,c; if(argc < 2) { fprintf(stderr,"alice.txt is required\n"); return 1; } myFile=fopen(argv[1],"r"); if(myFile==NULL) { fprintf(stderr,"Cannot open; %s\n",argv[1]); } while ((c=fgetc(myFile)) !=EOF) { fprintf(stderr,"%c",c); } fclose(myFile); return 0; }

  • FeliCaを利用した認証システム

    FeliCaを使用した認証システムを開発しています。 認証方法 (1)PCに個人情報(IDm、名前)の登録を行う。この際、テキストファイル名をIDm(例 01 02 03 05.txt)としファイル内に名前を書き込む。 (2)リーダー/ライターにFeliCaをかざし、IDmを読み取る。 (3)ファイル内の情報を出力させる。 CUIでは、動くのですがGUIで動かすにはどこを替えればいいのでしょうか? 認証というボタン押すと登録された名前を出力させる感じです。 以下にCUIのコードを載せます。 // sample.cpp -*-c++-*- #include <cstdio> #include <cstdlib> #include "felica.h" int main(void); void error_routine(void); void print_vector(char* title, unsigned char* vector, int length); int main(void) { char file[28]; char kawa[6]=".txt"; int i; FILE *fp; int ninzu = 0; char name[100]; //ライブラリの初期化 if (!initialize_library()) { fprintf(stderr, "Can't initialize library.\n"); return EXIT_FAILURE; } //リーダ;ライタの自動認識とオープン if (!open_reader_writer_auto()) { fprintf(stderr, "Can't open reader writer.\n"); return EXIT_FAILURE; } //ポーリングのための宣言 structure_polling polling; unsigned char system_code[2] = {0x00, 0x00}; polling.system_code = system_code; polling.time_slot = 0x00; unsigned char number_of_cards = 0; structure_card_information card_information; unsigned char card_idm[8]; card_information.card_idm = card_idm; //ポーリングとカード情報の取得 if (!polling_and_get_card_information(&polling, &number_of_cards, &card_information)) { fprintf(stderr, "Can't find FeliCa.\n"); return EXIT_FAILURE; } fprintf(stdout, "number of cards: %d\n", number_of_cards); print_vector("card IDm:", card_idm, sizeof(card_idm)); //card_idmをfileに書き込む sprintf(file,"%02x %02x %02x %02x %02x %02x %02x %02x",card_idm[0],card_idm[1],card_idm[2],card_idm[3],card_idm[4],card_idm[5],card_idm[6],card_idm[7]); for(i=23;i<28;i++) file[i]=kawa[i-23]; printf("%s\n",file); if((fp=fopen(file,"r"))==NULL) printf("情報が登録されていません\n"); else{ while(fscanf(fp,"%s",name)==1){ printf("%-10s\n",name); ninzu++; } fclose(fp); } //リーダ。ライタのクローズ if (!close_reader_writer()) { fprintf(stderr, "Can't close reader writer.\n"); return EXIT_FAILURE; } //リーダ。ライタを開放する if (!dispose_library()) { fprintf(stderr, "Can't dispose library.\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; } void error_routine(void) { enumernation_felica_error_type felica_error_type; enumernation_rw_error_type rw_error_type; get_last_error_types(&felica_error_type, &rw_error_type); printf("felica_error_type: %d\n", felica_error_type); printf("rw_error_type: %d\n", rw_error_type); close_reader_writer(); dispose_library(); } void print_vector(char* title, unsigned char* vector, int length) { if (title != NULL) { fprintf(stdout, "%s ", title); } int i; for (i = 0; i < length - 1; i++) { fprintf(stdout, "%02x ", vector[i]); } fprintf(stdout, "%02x", vector[length - 1]); fprintf(stdout, "\n"); } どなたかご教授よろしくお願いします。

専門家に質問してみよう