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

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

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

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

Q&A

解決済

4回答

2968閲覧

C言語 わからないところの調べ方

kazuyakazuya

総合スコア193

C

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

0グッド

0クリップ

投稿2019/08/25 01:09

編集2019/08/25 01:31

C言語初心者です。知識が枯渇しているのでお願いします。
C言語で分からないところがあったらどのように調べればいいのでしょうか?
今回はC言語でソケットプログラミング
を見ていたのですが・・・
イメージ説明
パット見ただけでも

c

1 2#include <sys/fcntl.h> 3 4#include <sys/types.h> 5 6#include <sys/socket.h> 7 8#include <netinet/in.h> 9 10#include <netdb.h> 11 12#include <stdio.h> 13 14 15 16void send_input_data(int sockfd); 17 ↑ここ 18 19 20main(int argc, char **argv) { 21 22 int sockfd; 23 24 struct sockaddr_in client_addr; 25     ↑ 26    ここ

(大きくなってしまうので部分的に・・・)
上記だけでも2か所分からないところがあります。

このように場所はどのように調べればいいのでしょうか?
例えばRubyなら・・・Rubyリファレンス

ruby

1require 'socket' 2sock = TCPServer.open(****) 3sock.accept

上記のような意味不明なメソッドが出てきても

ruby

1require 'socket'   ←1 ソケットライブラリを使うのか! socketのリファレンスを参照 2sock = TCPServer.open(****) ←←2 リファレンスを参照し、しらみ潰しでメソッドを探せばいい 3sock.accept     ←2 リファレンスを参照し、しらみ潰しでメソッドを探せばいい

とのように、リファレンスを見ればどうにかなりますが
C言語の場合どのように調べればいいのですか?

基礎が分からないので参考になるリンクまたは説明をお願いします。

追記

c

1void send_input_data(int sockfd);

こちらはどういうものなんでしょうか?
そのまま調べても出てこなかったので・・・

まずここで

c

1void send_input_data(int sockfd); 2の中に 3send

があるので
参考記事
イメージ説明
だと思ったのですがやはり違いますよね・・・

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

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

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

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

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

guest

回答4

0

プログラムを読む場合、前提として知っていなければならないことと、その都度調べれば良いことがあります。
前提として知っていなければならないことは、C言語自体の仕様です。

void send_input_data(int sockfd);

これは、関数プロトタイプの宣言で、ソースのここより下方で定義される関数を、定義前に呼べるように、関数名と型、引数と型、について記述したものです。
関数の中身は後方で定義されているので、意味はそこを読みます。
以上のことは、プログラムを読む前提として知っている必要があります。

struct sockaddr_in client_addr;

これはsockaddr_inという構造体の変数client_addrを宣言する文です。それは知っていますよね?
構造体sockaddr_inが具体的にどういうメンバーを持つ構造体であるのかについては、記憶しておく必要は無く、(その分野に詳しくて暗記していない限り)毎回調べます。
構造体sockaddr_inの定義はプログラムのここより上方に必ずあります。
多くの場合は、上方で#includeされたヘッダファイルの中にありますので、それぞれから探します。さらに#includeされた先かも知れませんが、どこかに必ず書いてあります。
以上のことも、プログラムを読む前提として知っている必要があります。

構造体sockaddr_inが具体的にどういうメンバーであるかが分かっても、どういう時に何を格納して使うのかはヘッダファイルからは多くの場合分かりません。
システムで提供されるヘッダファイルで定義されている構造体は、基本的にはシステムコールないしライブラリ関数で引数か返り値として使われているはずですので、その構造体を引数か返り値として使っている関数が、プログラムのどこかにあるはずです。その関数について、man 関数名のコマンドを実行することで、関数とその構造体の説明があるはずです。

ただ、manで表示されるマニュアルは初心者向けでは無いので、理解できない場合はググって解説記事を探すことになるかと思います。このあたりの事情はRubyのリファレンスマニュアルも同じですね。
関数名でググる方法もありますが、この場合「C言語 ソケット通信」というふうなググり方もあります。

投稿2019/08/25 07:17

otn

総合スコア84710

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

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

otn

2019/08/25 07:19

あと、多分「枯渇」の意味を間違えて覚えていると思います。 「以前は十分有ったが失われて今は無い」という意味ですよ。
kazuyakazuya

2019/08/25 10:29

ありがとうございます! 枯渇の意味は間違えて覚えていたのですね・・・ 他の方にも指摘をされました。 (どこで覚えたか分からないけど  資源が枯渇した・・・とか)
guest

0

CRubyPythonと同じように機能をまとめて提供する仕組みがあり、一般的にはライブラリと呼ばれています。
そのライブラリのマニュアル(変数、関数一覧や使い方)も基本的にはライブラリの作成者が提供しています。

しかしこの辺り歴史の古いCゆえに、マニュアルはライブラリに同梱されたテキストファイルのみ、果てはソースのみといったことも多いです。そもそもヘッダを見るだけでもどんな関数や変数があるかまでは分かりますので。

概要や使い方を知りたい場合は、ヘッダファイル名で検索するとだいたいそれに関する情報がひっかかってきます。
たとえば質問で提示されたヘッダであれば以下がひっかかってきました。
<sys/types.h>
<fcntl.h>
<sys/socket.h>

なお、void send_input_data(int sockfd);は提示リンクソース中で定義された関数なのでソースを確認ください。

投稿2019/08/25 01:39

編集2019/08/25 02:49
can110

総合スコア38268

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

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

kazuyakazuya

2019/08/25 01:43

ありがとうございます。
guest

0

ベストアンサー

調べ方は Ruby と同じです。
リファレンスを読みましょう。

void send_input_data(int sockfd);

これは自作関数のプロトタイプ宣言なので、リファレンスに書いてありません。
同じソースファイルに関数の定義が書いてあります。

C

1void send_input_data(int sockfd) { 2 3 char buf[128]; 4 5 int buf_len; 6 7 while(1){ 8 9 buf_len = read(0, buf, 1); 10 11 write(sockfd, buf, buf_len); 12 13 } 14 15}

struct sockaddr_in client_addr;

構造体の定義を知りたいのであれば、ヘッダファイル(<netinet/in.h>)を読むのが手っ取り早いです。

C

1struct sockaddr_in { 2 3 short sin_family; 4 5 unsigned short sin_port; 6 7 struct in_addr sin_addr; 8 9 char sin_zero[8]; 10 11};

投稿2019/08/25 01:30

nskydiving

総合スコア6500

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

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

kazuyakazuya

2019/08/25 01:34

ありがとうございます。
guest

0

とにかくそのキーワードでぐぐりましょう.

投稿2019/08/25 01:17

編集2019/08/25 01:18
y_waiwai

総合スコア87784

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

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

kazuyakazuya

2019/08/25 01:23

ありがとうございます。 ただ、キーワードをひたすら検索するというのも 効率が悪いですし (Rubyでもあったように) C言語ではC言語の調べ方があるのでは? と思い質問しました。 まだ解決にはしません・・・。
y_waiwai

2019/08/25 01:30

どう調べるか、ってのは各人各様なんで、あなたはあなたにあった調べ方を見つけてください
kazuyakazuya

2019/08/25 01:32

やはりそういうものなのでしょうか・・・
y_waiwai

2019/08/25 01:36

私は、とにかくぐぐりまくって、その関数がLinux由来のもの、とわかれば今度はLinuxのドキュメント関係をぐぐって探して、カーネルソースをぐぐって探す、などなど、とにかくぐぐりますね。 それでは効率が悪い、というのももっともなはなしで、それ以外に効率のいいやり方があるというのならそっちのほうがいいでしょうね。
kazuyakazuya

2019/08/25 01:38

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問