Mercurial > hg > audiostuff
comparison intercom/tcp.cpp @ 2:13be24d74cd2
import intercom-0.4.1
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 09:57:52 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 1 /* tcp.cpp | |
| 2 * | |
| 3 * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005). | |
| 4 * All Rights Reserved. | |
| 5 * | |
| 6 * TCP server functions for IPv4 | |
| 7 * | |
| 8 * Version 0.2 | |
| 9 * adr 11sep2005 TCP client | |
| 10 */ | |
| 11 | |
| 12 | |
| 13 #include <stdio.h> | |
| 14 #include <stdlib.h> | |
| 15 #include <string.h> | |
| 16 | |
| 17 /* Socket io */ | |
| 18 #include <sys/socket.h> | |
| 19 #include <netinet/in.h> | |
| 20 #include <netinet/tcp.h> | |
| 21 #include <assert.h> | |
| 22 #include <sys/types.h> | |
| 23 #include <netdb.h> | |
| 24 #include <sys/time.h> | |
| 25 #include <unistd.h> | |
| 26 #include <sys/errno.h> | |
| 27 #include <fcntl.h> | |
| 28 | |
| 29 /* error handling */ | |
| 30 #include <assert.h> | |
| 31 | |
| 32 #include <signal.h> | |
| 33 | |
| 34 #include "intercomd.h" | |
| 35 | |
| 36 int tcp_server_init(int port) | |
| 37 /* open the server (listen) port - do this one time*/ | |
| 38 { | |
| 39 int fd = socket(PF_INET, SOCK_STREAM, 0); | |
| 40 assert_errno(fd >= 0); | |
| 41 | |
| 42 struct sockaddr_in sock; | |
| 43 memset((char *) &sock, 0, sizeof(sock)); | |
| 44 sock.sin_family = AF_INET; | |
| 45 sock.sin_addr.s_addr = htonl(INADDR_ANY); | |
| 46 sock.sin_port = htons(port); | |
| 47 if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) < 0) { | |
| 48 fprintf(stderr, "tcp_recv_init(): bind() failed\n"); | |
| 49 exit(2); | |
| 50 } | |
| 51 | |
| 52 int ret = listen(fd, 1); | |
| 53 assert_errno(ret >= 0); | |
| 54 | |
| 55 return fd; | |
| 56 } | |
| 57 | |
| 58 #define SA struct sockaddr | |
| 59 | |
| 60 int | |
| 61 socket_async(char *addr, int port) { | |
| 62 /* Tcl Prozedur socket -async */ | |
| 63 /* in addr: Server IP-Adresse auf den gehoert wird */ | |
| 64 /* in port: Server TCP-Port auf den gehoert wird */ | |
| 65 struct sockaddr_in servaddr; | |
| 66 struct hostent *foreign_host; | |
| 67 int sockfd; | |
| 68 int flags; | |
| 69 | |
| 70 /* Siehe Stevens[1998] Kap. 15.4 oder man 2 connect */ | |
| 71 | |
| 72 /* init local part */ | |
| 73 sockfd = socket(AF_INET, SOCK_STREAM, 0); | |
| 74 if (sockfd < 0) { | |
| 75 syslog(LOG_WARNING, "socket_async(): local socket() failed"); | |
| 76 return -1; | |
| 77 } | |
| 78 if (sockfd >= 64) { | |
| 79 syslog(LOG_WARNING, "socket_async(): local socket() sockfd >= 64"); | |
| 80 return -1; | |
| 81 } | |
| 82 | |
| 83 /* init foreign part */ | |
| 84 memset((char *)&servaddr, 0, sizeof(servaddr)); | |
| 85 | |
| 86 foreign_host = gethostbyname(addr); | |
| 87 if (foreign_host == NULL || foreign_host->h_length == 0) { | |
| 88 syslog(LOG_WARNING, | |
| 89 "socket_async(): gethostbyname(%s) failed", | |
| 90 addr); | |
| 91 return -1; | |
| 92 } | |
| 93 memcpy(&servaddr.sin_addr.s_addr, foreign_host->h_addr_list[0], foreign_host->h_length); | |
| 94 servaddr.sin_family = AF_INET; | |
| 95 servaddr.sin_port = htons(port); | |
| 96 | |
| 97 /* NONBLOCK */ | |
| 98 flags = fcntl(sockfd, F_GETFL, 0); | |
| 99 fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); | |
| 100 | |
| 101 if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) != 0) { | |
| 102 if (errno != EINPROGRESS) { | |
| 103 perror("tcl.c::socket_async() connect() failed"); | |
| 104 return -1; | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 printf("info tcp.cpp::socket_async(): host=%s IP=0x%X Port=%u\n", | |
| 109 addr, ntohl(servaddr.sin_addr.s_addr), port); | |
| 110 | |
| 111 return sockfd; | |
| 112 } | |
| 113 | |
| 114 | |
| 115 | |
| 116 int tcp_server_init2(int listen_fd) | |
| 117 /* open the communication (connection) - do this for every client */ | |
| 118 { | |
| 119 // fprintf(stderr, "tcp_server_init2\n"); | |
| 120 | |
| 121 // avoid blocking accept() | |
| 122 int flags = fcntl(listen_fd, F_GETFL); | |
| 123 int ret = fcntl(listen_fd, F_SETFL, flags | O_NONBLOCK); | |
| 124 assert_errno(ret >= 0); | |
| 125 | |
| 126 struct sockaddr_in sock; | |
| 127 socklen_t socklen = sizeof(sock); | |
| 128 int fd = accept(listen_fd, (struct sockaddr *) &sock, &socklen); | |
| 129 assert_errno(fd >= 0); | |
| 130 | |
| 131 return fd; | |
| 132 } |
