ライブラリの作成
作業環境
- Cygwinのホームディレクトリ以下に
ホーム/soc/1-1/mylib
のようなディレクトリを作成し、そこで作業を行う。
ソース
mylib.h
/*********************************************/ /* File name: mylib.h */ /* Project name: socket/mylib */ /* Month/Year: Jan/2003 */ /* Author: Shuichi YUKITA */ /*********************************************/ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> extern int setup_server(u_short port); extern int setup_client(char *hostname, u_short port); extern int mserver_socket(u_short port, int num); extern int mserver_maccept(int soc, int limit, void (*func)()); extern char *chop_newline(char *buf, int len);
setup_server.c
/*********************************************/ /* File name: setup_server.c */ /* Project name: socket/mylib */ /* Month/Year: Jan/2003 */ /* Author: Shuichi YUKITA */ /*********************************************/ #include "mylib.h" int setup_server(u_short port) { struct sockaddr_in me; int s, s_waiting; memset((char *)&me, 0, sizeof(me)); me.sin_family = AF_INET; me.sin_addr.s_addr = htonl(INADDR_ANY); me.sin_port = htons(port); if ((s_waiting = socket(AF_INET,SOCK_STREAM,0)) < 0 ){ perror("socket"); return -1; } if (bind(s_waiting,(struct sockaddr *)&me,sizeof(me)) == -1){ perror("bind"); return -1; } listen(s_waiting,1); fprintf(stderr,"successfully bound, now waiting.\n"); s = accept(s_waiting, NULL, NULL); close(s_waiting); return s; }
setup_client.c
/*********************************************/ /* File name: setup_client.c */ /* Project name: socket/mylib */ /* Month/Year: Jan/2003 */ /* Author: Shuichi YUKITA */ /*********************************************/ #include "mylib.h" int setup_client(char *hostname, u_short port) { struct hostent *server_ent; struct sockaddr_in server; int s; if((server_ent = gethostbyname(hostname)) == NULL){ perror("gethostbyname"); return -1; } memset((char *)&server,0,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(port); memcpy((char *)&server.sin_addr, server_ent->h_addr, server_ent->h_length); if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("socket"); return -1; } if (connect(s,(struct sockaddr *)&server,sizeof(server)) == -1) { perror("connect"); return -1; } fprintf(stderr,"connected.\n"); return s; }
chop_newLine.c
初めの一歩 と少し違う。
/*********************************************/ /* File name: chop_newline.c */ /* Project name: socket/mylib */ /* Month/Year: Jan/2003 */ /* Author: Shuichi YUKITA */ /*********************************************/ #include "mylib.h" char * chop_newline(char *str, int len){ int n=strlen(str); if(n<len &&str[n-1]=='\n'){ str[n-1]='\0'; } return str; }
ビルド Makefile
#*********************************************/ #* File name: Makefile */ #* Project name: socket/mylib */ #* Month/Year: Jan/2003 */ #* Author: Shuichi YUKITA */ #*********************************************/ # # Since mylib.a consists of rather a small set of objects, # it will be easier just to clean up and build from scratch. # # "root.o" target is implicitly built by # "$(COMPILE.c) -o root.o root.c" #OBJS=setup_client.o setup_server.o chop_newline.o setup_mserver.o OBJS=setup_client.o setup_server.o chop_newline.o RM=rm -f AR=ar -qc mylib.a: $(OBJS) $(RM) mylib.a $(AR) mylib.a $(OBJS) setup_client.o: setup_client.c mylib.h setup_server.o: setup_server.c mylib.h #setup_mserver.o: setup_mserver.c mylib.h chop_newline.o: chop_newline.c mylib.h clean: $(RM) *.o mylib.a *~
実行
ライブラリ単独で実行するものはない。