echoクライアント用のソースの一部
どうも、検索ワード"echo クライアント"で引っかかってるようなんで、夏に書いたやつの一部をとりあえずコピペ。参考資料はbit別冊の。
connect_sock("192.168.51.33","echo","TCP")とかconnect_sock("www.yahXX.ne.jp","7","UDP")とかすると、それぞれ適宜接続してくれる関数ですよ。
第一引数には接続先アドレス、第二引数にはポート番号またはサービス名、第三引数には接続プロトコルを指定する。返り値はソケットのディスクリプタ。
この辺の作業はいちど自作しておくと便利だそうだ。みんな自分で書いたコードを使いまわすんだってさ。少なくとも私はこのコードを使いまわす予定。
エラーの扱いはかなりアヤシイ。enumで指定してれば良いのかな。
ヘッダファイルのインクルードは適宜お願いします。
int connect_sock(const char *hostname, const char *service, const char *protocol) { int sock; /* socket descriptor */ int socktype; /* type of socket */ struct hostent *phost; struct servent *pserv; struct protoent *pproto; struct sockaddr_in sin; /* sockaddr_in requires: protocol family (AF_INET) host ip address (network byte order) host port number (network byte order) */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; /* address family on Internet */ /*set port*/ if( pserv = getservbyname(service, protocol) ){ sin.sin_port = pserv->s_port; }else if( (sin.sin_port = htons((u_int16_t)atoi(service))) == 0 ){ return NO_SUCH_PORT_ERROR; /* no such port */ } /*set host*/ if( phost = gethostbyname(hostname) ){ memcpy(&sin.sin_addr, phost->h_addr_list[0], phost->h_length); }else if( (sin.sin_addr.s_addr = inet_addr(hostname)) ){ return NO_SUCH_HOST_ERROR; /* no such host */ } /*set protocol*/ if( (pproto = getprotobyname(protocol)) == 0 ){ return NO_SUCH_PROTO_ERROR; /* no such protocol */ } /*set socket-type*/ if( strcmp(protocol, "udp") == 0 || strcmp(protocol, "UDP") == 0 ){ socktype = SOCK_DGRAM; }else{ socktype = SOCK_STREAM; } /*make socket*/ sock = socket(PF_INET, socktype, pproto->p_proto); if(sock<0){ return SOCKET_NOGOOD_ERROR; /* somehow we couldn`t make the socket */ } printf("got socket : %d\n", sock); /*connect*/ if( connect(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0 ){ return CONNECT_NOGOOD_ERROR; /* somehow we couldn`t connect */ } return sock; }