###前提・実現したいこと
下記の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です.
![guest](/img/icon/icnUserSample.jpg)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。