Code:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
int main (int argc, char *argv[])
{
unsigned int buffer = 0;
struct sockaddr_in dest;
int fd;
int fdmask;
int run;
int res;
int optval;
int on;
socklen_t optlen;
int max_fd;
fd_set read_fd;
fd_set write_fd;
fd_set except_fd;
int len;
int cnt = 0;
struct timeval timeout;
if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "socket: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
memset(&dest, 0, sizeof(struct sockaddr));
dest.sin_family = AF_INET;
dest.sin_port = htons(5842);
if (!inet_aton("69.55.233.89", &dest.sin_addr))
{
fprintf(stderr, "address is not valid ...\n");
close(fd);
exit(1);
}
if ((fdmask = fcntl(fd, F_GETFL, 0)) < 0)
{
fprintf(stderr, "fcntl[F_GETFL]: %s\n", strerror(errno));
close(fd);
exit(EXIT_FAILURE);
}
fdmask |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, fdmask) < 0)
{
fprintf(stderr, "fcntl[F_SETFL]: %s\n", strerror(errno));
close(fd);
exit(EXIT_FAILURE);
}
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *) &on, sizeof(on)) < 0) {
fprintf(stderr, "SO_KEEPALIVE: %s\n", strerror(errno));
close(fd);
exit(EXIT_FAILURE);
}
if (connect(fd, (struct sockaddr *) &dest, sizeof(dest)) < 0 && errno != EINPROGRESS)
{
fprintf(stderr, "connect: %s\n", strerror(errno));
close(fd);
exit(EXIT_FAILURE);
}
fprintf(stderr, ":connected ...\n");
max_fd = fd;
run = 1;
while (run)
{
FD_ZERO(&read_fd);
FD_ZERO(&write_fd);
FD_ZERO(&except_fd);
FD_SET(fd, &read_fd);
FD_SET(fd, &write_fd);
FD_SET(fd, &except_fd);
timeout.tv_sec = 5;
timeout.tv_usec = 0;
fprintf(stderr, "waiting for data ...\n");
if ((res = select(max_fd + 1, &read_fd, &write_fd, &except_fd, &timeout)) < 0)
{
fprintf(stderr, "select: %s\n", strerror(errno));
run = 0;
continue;
}
optlen = sizeof(int);
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *) &optval, &optlen) < 0)
{
fprintf(stderr, "getsockopt: %s\n", strerror(errno));
run = 0;
continue;
}
if (optval) {
fprintf(stderr, "SO_ERROR: %s (%d)\n", strerror(optval), optval);
run = 0;
continue;
}
if (FD_ISSET(fd, &write_fd))
{
if ((fdmask = fcntl(fd, F_GETFL, 0)) < 0)
{
fprintf(stderr, "fcntl[F_GETFL]: %s\n", strerror(errno));
run = 0;
continue;
}
fdmask &= (~O_NONBLOCK);
fprintf(stderr, "set blocking mode ...\n");
if (fcntl(fd, F_SETFL, fdmask) < 0)
{
fprintf(stderr, "fcntl[F_SETFL]: %s\n", strerror(errno));
run = 0;
}
continue;
}
if (cnt > 3)
{
run--;
continue;
}
if (FD_ISSET(fd, &read_fd))
{
if ((len = read(fd, &buffer, sizeof(int))) < 0)
{
fprintf(stderr, "read: %s\n", strerror(errno));
run = 0;
continue;
}
fprintf(stdout, ": size %d; buffer %d\n", len, buffer);
cnt++;
}
}
close(fd);
return 0;
}
Lesezeichen