Annotation of OpenXM/src/ox_math/mysocket.c, Revision 1.1
1.1 ! ohara 1: /* -*- mode: C; coding: euc-japan -*- */
! 2: /* $OpenXM$ */
! 3: /* $Id: mysocket.c,v 1.1 1999/09/30 08:25:12 ohara Exp $ */
! 4: /*
! 5: setsockopt()してオプションを設定後,
! 6: socket, bind
! 7: するとローカルポートが割り当てられる。
! 8: その後, getsockname によってポート番号が求まる.
! 9: */
! 10:
! 11: #include <stdio.h>
! 12: #include <stdlib.h>
! 13: #include <unistd.h>
! 14: #include <errno.h>
! 15: #include <netdb.h>
! 16: #include <netinet/in.h>
! 17: #include <sys/types.h>
! 18: #include <sys/socket.h>
! 19: #include <fcntl.h>
! 20:
! 21: #if defined(__sun__)
! 22: #include <arpa/inet.h>
! 23: #endif
! 24:
! 25: #include "mysocket.h"
! 26:
! 27: static int getsocket(struct sockaddr_in *mp, char *host, short port)
! 28: {
! 29: struct hostent *ent = gethostbyname(host);
! 30:
! 31: memset(mp, '\0', sizeof(struct sockaddr_in));
! 32: mp->sin_family = AF_INET;
! 33: mp->sin_port = htons(port);
! 34: memcpy((char *)&mp->sin_addr, ent->h_addr, ent->h_length);
! 35:
! 36: return socket(AF_INET, SOCK_STREAM, 0);
! 37: }
! 38:
! 39: int mysocketAccept(int s_waiting)
! 40: {
! 41: int val = accept(s_waiting, NULL, NULL);
! 42: return val;
! 43: }
! 44:
! 45: int mysocketListen(char *hostname, short *portp)
! 46: {
! 47: int option;
! 48: int tmp;
! 49: struct sockaddr_in me;
! 50:
! 51: int s_waiting = getsocket(&me, hostname, *portp);
! 52:
! 53: option = 1;
! 54: setsockopt(s_waiting, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
! 55:
! 56: if (bind(s_waiting, (struct sockaddr *)&me, sizeof(me)) < 0) {
! 57: fprintf(stderr, "bind: failed.\n");
! 58: exit(1);
! 59: }
! 60:
! 61: tmp = sizeof(me);
! 62: if (getsockname(s_waiting, (struct sockaddr *)&me, &tmp) < 0) {
! 63: fprintf(stderr, "getsockname is failed.\n");
! 64: exit(1);
! 65: }
! 66:
! 67: *portp = ntohs(me.sin_port);
! 68:
! 69: if (listen(s_waiting, 1) < 0) {
! 70: fprintf(stderr, "listen: failed.\n");
! 71: exit(1);
! 72: }
! 73:
! 74: return s_waiting;
! 75: }
! 76:
! 77: int mysocketOpen(char* hostname, short port)
! 78: {
! 79: struct sockaddr_in serv;
! 80: int s = getsocket(&serv, hostname, port);
! 81:
! 82: fprintf(stderr, "get socket address for port number %d.\n", port);
! 83: if (connect(s, (struct sockaddr *)&serv, sizeof(serv)) != 0) {
! 84: fprintf(stderr, "connect: fail! socket = %d, errno = %d\n", s, errno);
! 85: exit(-1);
! 86: }
! 87: return s;
! 88: }
! 89:
! 90: int mypipe(char *program, int fd1, int fd2)
! 91: {
! 92: int sockfd[2];
! 93: if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) < 0) {
! 94: fprintf(stderr, "socketpair: fail! errno = %d\n", errno);
! 95: }
! 96: if (fork() == 0) {
! 97: /* 子プロセス */
! 98: close(sockfd[0]);
! 99: dup2(sockfd[1], fd1);
! 100: dup2(sockfd[1], fd2);
! 101: execl(program, program, NULL);
! 102: }
! 103: /* 親プロセス */
! 104: close(sockfd[1]);
! 105: return sockfd[0];
! 106: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>