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

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

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

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

3回答

7723閲覧

Cによるネットワークプログラミングを理解したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

1クリップ

投稿2016/05/07 04:54

###前提・実現したいこと
下記のC言語によるネットワーク対戦鬼ごっこプログラムを理解したいので, 理解に必要だったり役に立つ書籍やウェブサイトを教えていただきたいです.
私は柴田望洋氏の新明解C言語入門編を終えたばかりで, ネットワークに関する勉強はほとんどしていませんので, 下記のソースコードはほとんど理解できません.
分からない部分を個別で調べてみたりもしたのですが, なにぶん分からないことが多いので書籍などで勉強したいです.

###該当のソースコード

C

1#ifndef _GAME_LIB_H_ 2#define _GAME_LIB_H_ 3 4#include <stdio.h> 5#include <stdlib.h> 6#include <string.h> 7#include <unistd.h> 8#include <sys/types.h> 9#include <sys/socket.h> 10#include <netinet/in.h> 11#include <arpa/inet.h> 12#include <netdb.h> 13#include <errno.h> 14#include <sys/time.h> 15 16#define DEFAULT_PORT 6000 17#define MAX_MSG 1024 18#define STRNCMP(STRING_A,STRING_B) strncmp(STRING_A, STRING_B, strlen(STRING_B)) 19#define MIN(a,b) (((a)<(b))?a:b) 20 21typedef enum _Status { 22 CONNECTED, 23 DISCONNECTED, 24} Status; 25 26typedef enum _Control { 27 OPEN_SESSION, 28 CLOSE_SESSION, 29 SESSION_ESTABLISHED, 30 COORDINATION, 31 GAMEOVER, 32 EXCEPTION, 33} Control; 34 35typedef struct _Control_Parameter { 36 Control control; 37 char* parameter; 38} Control_parameter; 39 40int socket_and_bind(int myPort); 41void get_server_addr(char *hostname, int port, struct sockaddr_in *p_addr); 42int send_message(int mySocket, char *buf, struct sockaddr_in *p_addr); 43int send_open_session(int mySocket, struct sockaddr_in *p_addr, int lines, int cols); 44int send_close_session(int mySocket, struct sockaddr_in *p_addr); 45int send_coordinateion(int mySocket, struct sockaddr_in *p_addr, int x, int y); 46int send_gameover(int mySocket, struct sockaddr_in *p_addr); 47int send_session_established(int mySocket, struct sockaddr_in *p_addr, int lines, int cols); 48int receive_message(int mySocket, char *buf, struct sockaddr_in *p_addr); 49int sockaddr_in_cmp(struct sockaddr_in *first, struct sockaddr_in *second); 50Control_parameter message_interpreter(char* buffer); 51 52#endif /* _GAME_LIB_H_ */

C

1#include "game_lib.h" 2 3int socket_and_bind(int port) 4{ 5 int mySocket; 6 struct sockaddr_in myAddr; 7 /* ソケット生成 */ 8 if((mySocket = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ 9 fprintf(stderr,"Error:socket\n"); 10 exit(EXIT_FAILURE); 11 } 12 /* 自身のアドレス構造体設定 */ 13 bzero((char *)&myAddr, sizeof(myAddr)); 14 myAddr.sin_family = AF_INET; 15 myAddr.sin_addr.s_addr = htonl(INADDR_ANY);/*使用NIC制約なし*/ 16 myAddr.sin_port = htons(port);/*設定ポート番号*/ 17 /* アドレス構造体の情報を生成ソケットに関連づけ */ 18 if(bind(mySocket, (struct sockaddr *)&myAddr, sizeof(myAddr)) < 0){ 19 fprintf(stderr,"Error:bind\n"); 20 exit(EXIT_FAILURE); 21 } 22 return mySocket; 23} 24 25void get_server_addr(char *hostname, int port, struct sockaddr_in *p_addr) 26{ 27 struct hostent *pHostent = gethostbyname(hostname); 28 if(pHostent==NULL){ 29 fprintf(stderr,"Error:get_server_addr\n"); 30 exit(EXIT_FAILURE); 31 } else { 32 /* サーバのアドレス構造体の設定 */ 33 bzero((char *) p_addr, sizeof(struct sockaddr_in)); 34 p_addr->sin_family = AF_INET; 35 p_addr->sin_port = htons(port); 36 bcopy(pHostent->h_addr,(char*)&(p_addr->sin_addr.s_addr),pHostent->h_length); 37 } 38} 39 40int send_message(int mySocket, char *buf, struct sockaddr_in *p_addr) 41{ 42 int sent_len = sendto(mySocket, buf, strlen(buf), 0, (struct sockaddr *)p_addr, sizeof(*p_addr)); 43 if(sent_len==-1){ 44 fprintf(stderr,"Error:send_message\n"); 45 exit(EXIT_FAILURE); 46 } else { 47 return sent_len; 48 } 49} 50 51int send_open_session(int mySocket, struct sockaddr_in *p_addr, int lines, int cols) 52{ 53 char buffer[MAX_MSG]; 54 sprintf(buffer,"open_session:%d:%d",lines,cols); 55 return send_message(mySocket, buffer, p_addr); 56} 57 58int send_close_session(int mySocket, struct sockaddr_in *p_addr) 59{ 60 return send_message(mySocket, "close_session", p_addr); 61} 62 63int send_coordinateion(int mySocket, struct sockaddr_in *p_addr, int x, int y) 64{ 65 char buffer[MAX_MSG]; 66 sprintf(buffer,"coordination:%d:%d", x, y); 67 return send_message(mySocket, buffer, p_addr); 68} 69 70int send_gameover(int mySocket, struct sockaddr_in *p_addr) 71{ 72 return send_message(mySocket, "gameover", p_addr); 73} 74 75int send_session_established(int mySocket, struct sockaddr_in *p_addr, int lines, int cols) 76{ 77 char buffer[MAX_MSG]; 78 sprintf(buffer,"session_established:%d:%d",lines,cols); 79 return send_message(mySocket, buffer, p_addr); 80} 81 82int receive_message(int mySocket, char *buf, struct sockaddr_in *p_addr) 83{ 84 socklen_t addr_len = sizeof(*p_addr);/*型はintでもOKだが,warningがでるのでsocklen_tとする*/ 85 int read_len = recvfrom(mySocket, buf, MAX_MSG, 0, (struct sockaddr *)p_addr, &addr_len); 86 if(read_len==-1){ 87 fprintf(stderr,"Error:receive_message\n"); 88 exit(EXIT_FAILURE); 89 } else { 90 buf[read_len] = '\0'; 91 return read_len; 92 } 93} 94 95int sockaddr_in_cmp(struct sockaddr_in *first,struct sockaddr_in *second) 96{ 97 if(first->sin_port == second->sin_port 98 && first->sin_addr.s_addr == second->sin_addr.s_addr){ 99 return 0; 100 } else{ 101 return 1; 102 } 103} 104 105Control_parameter message_interpreter(char* buffer) 106{ 107 Control_parameter control_parameter; 108 static char parameter[MAX_MSG]; 109 control_parameter.parameter=parameter; 110 if(!STRNCMP(buffer, "open_session")){ 111 sscanf(buffer, "open_session:%[^\n]", parameter); 112 control_parameter.control=OPEN_SESSION; 113 } else if(!STRNCMP(buffer, "close_session")){ 114 control_parameter.control=CLOSE_SESSION; 115 } else if(!STRNCMP(buffer, "session_established")){ 116 sscanf(buffer, "session_established:%[^\n]", parameter); 117 control_parameter.control=SESSION_ESTABLISHED; 118 } else if(!STRNCMP(buffer, "coordination")){ 119 sscanf(buffer, "coordination:%[^\n]", parameter); 120 control_parameter.control=COORDINATION; 121 } else if(!STRNCMP(buffer, "gameover")){ 122 control_parameter.control=GAMEOVER; 123 } else { 124 control_parameter.control=EXCEPTION; 125 } 126 return control_parameter; 127}

###補足情報(言語/FW/ツール等のバージョンなど)
環境はMacOS Xです.

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

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

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

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

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

guest

回答3

0

ベストアンサー

まずはC言語の基礎はある前提とします。

課題は主に2つあると思います。
一つ目はTCP/IPによるネットワークの基礎の基礎です。
二つ目はOSの提供するAPIに関する知識です。

総じていえることは「C言語上でソケットを使う方法」を学ぶことが必要です。C言語単独では、ほぼコンピュータの中のメモリアクセスに関する単純な機能しかありません。ネットワーク機能を使うとかになると、OSの機能をC言語から呼び出す必要があります。(このインタフェースをAPIといいます)これはOSごとに独自に用意されているのでこの仕様を調べることが要求されます。

なお、ネットワークに関しては詳しい知識は必要ありません。ネットワークといえば中継機器間でのルーティング、スイッチングも重要課題ですが、この問題ではそこを考える必要はありません。このプログラムでは両端末間の通信は正常に行うことができていることを前提としています(IPアドレスまたはドメインが既知であることが必要)。ここでは「ソケット」の使い方だけわかっておけば十分だと思います。

投稿2016/05/07 05:19

HogeAnimalLover

総合スコア4830

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

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

0

いわゆるバークレーソケットと呼ばれるBSD UNIXでの基本的な通信PGMです。
Mac OSXも、中身はDarwinと呼ばれるUNIXなので、このような方式で通信を行います。WindowsでもWinSockと呼ばれる仕組みで実装しますが、ほとんど同じような形で実現できます。

ソケットプログラミングで検索すると、いろいろ情報が見つかると思います。

現在では直接ソケットを使うようなプログラムを書くことは稀ですが、知っておくにこしたことはない内容だと思います。

投稿2016/05/07 06:20

shanxia

総合スコア1038

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

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

0

ネットワークに限らず、Mac(Unix)環境でCを学習するのでしたら、値が張りますが、詳解UNIXプログラミングがいいかと思います(ネットワークのプログラミングについても書かれています)。
さらに突き詰めるようであれば、UNIXネットワークプログラミング〈Vol.1〉UNIXネットワークプログラミング〈Vol.2〉でしょうか。

いずれも大型本ですが、持っていて損はないと思います。

追補:
UNIXネットワークプログラミングですが、店頭では入手困難の模様なので、TCP/IPソケットプログラミングC言語編もおすすめに入れておきます。

投稿2016/05/07 05:25

編集2016/05/07 12:27
archiver

総合スコア1557

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問