#include #include #include #include #include #include #include #include #include extern char *optarg; #define HOST "192.168.0.1" #define PORT 0 void handler(int); int main(int argc, char **argv) { struct sockaddr_in saddr; int ret; int fd; char buf[BUFSIZ]; int val; int c; unsigned short port = PORT; size_t len; char *host = HOST; val = 0; len = sizeof(val); while ((c = getopt(argc, argv, "h:p:")) != -1) { switch (c) { case 'h': host = (char *)strdup(optarg); break; case 'p': port = atoi(optarg); break; default: break; } } memset(&saddr, 0, sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = inet_addr(host); fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { printf("socket\n"); exit(1); } val = fcntl(fd, F_GETFL); if (val < 0) { printf("fcntl get\n"); exit(1); } ret = fcntl(fd, F_SETFL, val | O_NONBLOCK); if (ret < 0) { printf("fcntl set\n"); exit(1); } ret = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); if (ret < 0) { if (errno == EINPROGRESS) { printf("connect: EINPROGRESS (expected)\n"); } else { printf("unexpected errno from connect, errno = %d" " msg = %s\n", errno, strerror(errno)); } } /* make sure errno is 0 */ errno = 0; val = read(fd, buf, 0); printf("read() returns %d, errno = %d, msg = %s\n", val, errno, (val < 0) ? strerror(errno) : ""); errno = 0; ret = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); printf("connect returns %d, err = %s\n", ret, strerror(errno)); close(fd); exit(0); }