00001
00002
00003
00004
00005 #include <iostream>
00006
00007 #include "mysocket.h"
00008 #include "avrerror.h"
00009
00010 using namespace std;
00011
00012 #if !(defined(_MSC_VER) || defined(HAVE_SYS_MINGW))
00013
00014 #include <errno.h>
00015 #include <fcntl.h>
00016 #include <iostream>
00017 #include <arpa/inet.h>
00018 #include <netinet/in.h>
00019 #include <netinet/tcp.h>
00020 #include <stdio.h>
00021 #include <string.h>
00022 #include <sys/poll.h>
00023 #include <sys/socket.h>
00024 #include <sys/types.h>
00025 #include <unistd.h>
00026
00027 #else
00028
00029 int Socket::socketCount = 0;
00030
00031 void Socket::Start() {
00032 if(socketCount == 0) {
00033 WSADATA info;
00034 if(WSAStartup(MAKEWORD(2, 2), &info))
00035 avr_error("Could not start WSA");
00036 }
00037 socketCount++;
00038 }
00039
00040 void Socket::End() {
00041 WSACleanup();
00042 }
00043
00044 Socket::Socket(int port) {
00045 Start();
00046 _socket = socket(AF_INET, SOCK_STREAM, 0);
00047 if(_socket == INVALID_SOCKET)
00048 avr_error("Couldn't create socket: INVALID_SOCKET");
00049
00050 hostent *he;
00051 if((he = gethostbyname("127.0.0.1")) == 0)
00052 avr_error("Couldn't create connection: %s", strerror(errno));
00053
00054 sockaddr_in addr;
00055 addr.sin_family = AF_INET;
00056 addr.sin_port = htons(port);
00057 addr.sin_addr = *((in_addr *)he->h_addr);
00058 memset(&(addr.sin_zero), 0, 8);
00059
00060 u_long arg = 1;
00061 ioctlsocket(_socket, FIONBIO, &arg);
00062
00063 if(::connect(_socket, (sockaddr *) &addr, sizeof(sockaddr)))
00064 avr_error("Couldn't create connection: %s", strerror(WSAGetLastError()));
00065
00066 cerr << "User Interface Connection opened by host " << inet_ntoa(addr.sin_addr) << " port " << ntohs(addr.sin_port) << endl;
00067 }
00068
00069 Socket::~Socket() {
00070 closesocket(_socket);
00071 socketCount--;
00072 if(socketCount == 0)
00073 End();
00074 }
00075
00076 ssize_t Socket::Poll() {
00077 u_long arg = 0;
00078 if(ioctlsocket(_socket, FIONREAD, &arg) != 0)
00079 return 0;
00080 return arg;
00081 }
00082
00083 #endif
00084
00085 ssize_t Socket::Read(string &a) {
00086 char buf[256];
00087 #if defined(_MSC_VER) || defined(HAVE_SYS_MINGW)
00088 ssize_t len = recv(_socket, buf, 255, 0);
00089 #else
00090 ssize_t len = read( conn, &buf, 255 );
00091 #endif
00092
00093 if(len < 0)
00094 len=0;
00095 buf[len]= '\0';
00096 a += buf;
00097 return len;
00098 }
00099
00100 void Socket::Write(const string &s) {
00101 #if defined(_MSC_VER) || defined(HAVE_SYS_MINGW)
00102 int err = ::send(_socket, s.c_str(), s.length(), 0);
00103 #else
00104 int err = ::write( conn, s.c_str(), s.size());
00105 #endif
00106 if (err<0)
00107 cerr << "Write in UI fails!" << endl;
00108 }
00109
00110 #if !(defined(_MSC_VER) || defined(HAVE_SYS_MINGW))
00111
00112 Socket::Socket(int port) {
00113 OpenSocket(port);
00114 }
00115
00116 Socket::~Socket() {
00117 }
00118
00119 void Socket::OpenSocket(int port) {
00120 struct sockaddr_in address[1];
00121 int i;
00122
00123 if ( (sock = socket( PF_INET, SOCK_STREAM, 0 )) < 0 )
00124 cerr << "Can't create socket:" << strerror(errno) << endl;
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 #ifdef WE_ACT_AS_SERVER
00135 socklen_t addrLength[1];
00136 address->sin_family = AF_INET;
00137 address->sin_port = htons(port);
00138 memset( &address->sin_addr, 0, sizeof(address->sin_addr) );
00139
00140
00141 if ( bind( sock, (struct sockaddr *)address, sizeof(address) ) )
00142 cerr << "Can not bind socket: "<< strerror(errno) << endl;
00143
00144
00145 if ( listen(sock, 1) )
00146 {
00147 int saved_errno = errno;
00148 cerr << "Can not listen on socket: " << strerror(saved_errno) << endl;
00149 }
00150
00151 fprintf( stderr, "Waiting on port %d for user interface client to connect...\n", port );
00152
00153
00154 addrLength[0] = sizeof(struct sockaddr *);
00155
00156
00157 conn = accept( sock, (struct sockaddr *)address, addrLength );
00158 if (conn < 0)
00159 {
00160 int saved_errno = errno;
00161
00162
00163
00164
00165
00166
00167 cerr<< "Accept connection failed: " << strerror(saved_errno) << endl;
00168 }
00169
00170 i = 1;
00171 setsockopt (conn, IPPROTO_TCP, TCP_NODELAY, &i, sizeof (i));
00172 #else //so we are client
00173 address->sin_family= AF_INET;
00174 address->sin_port = htons(port);
00175 inet_pton(AF_INET, "127.0.0.1", &address->sin_addr);
00176 conn=sock;
00177
00178 int retry=0;
00179 int ret;
00180 do {
00181 ret = connect ( sock, (struct sockaddr *)address, sizeof(address));
00182 if (ret<0) {
00183 cerr << "No connect to socket possible now... retry " << strerror(errno) << endl;
00184 sleep(1);
00185 } else {
00186 break;
00187 }
00188
00189 } while (retry++ <10);
00190
00191 if(ret < 0)
00192 avr_error("Could not contact the ui-server, sorry");
00193
00194 #endif
00195
00196
00197
00198
00199 i = 1;
00200 setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i) );
00201
00202
00203
00204
00205 cerr << "User Interface Connection opened by host "<< inet_ntoa(address->sin_addr) << " port " << ntohs(address->sin_port) << endl;
00206
00207 fcntl(conn, F_SETFL, O_NONBLOCK);
00208 }
00209
00210
00211 ssize_t Socket::Poll() {
00212 pollfd pfd= {
00213 conn,
00214 POLLIN
00215 #ifdef POLLRDNORM
00216 | POLLRDNORM
00217 #endif
00218 #ifdef POLLRDBAND
00219 | POLLRDBAND
00220 #endif
00221 | POLLPRI,
00222 0
00223 };
00224
00225 int erg=poll( &pfd, 1, 0);
00226 if (erg<0) {
00227
00228 return 0;
00229 }
00230
00231 return erg;
00232 }
00233
00234 #endif
00235