トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

SocketLibrary

ライブラリの作成

  作業環境

  • 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 *~

  実行

ライブラリ単独で実行するものはない。