On Thu, Feb 15, 2007 at 04:04:05PM -0800, Stephen Hemminger ([EMAIL PROTECTED])
wrote:
> Someone want to take a stab at fixing this??
Works for me with attached application - select on connreset socket
immediately returns one ready descriptor.
$ ./a.out 192.168.0.48 22
select: err: 1, errno: 0.
write: err: 128, errno: 0.
select: err: 1, errno: 0.
write: err: 128, errno: 0.
select: err: 1, errno: 0.
write: err: -1, errno: 104.
on exit: select: err: 1, errno: 104.
--
Evgeniy Polyakov
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/poll.h>
#include <sys/sendfile.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <ctype.h>
#include <netdb.h>
#define ulog(f, a...) fprintf(stderr, f, ##a)
#define ulog_err(f, a...) ulog(f ": %s [%d].\n", ##a, strerror(errno), errno)
int main(int argc, char *argv[])
{
struct hostent *h;
int s, err;
char buf[128];
struct sockaddr_in sa;
fd_set rfds;
struct timeval tv;
if (argc != 3) {
ulog("Usage: %s <addr> <port>\n", argv[0]);
return -1;
}
h = gethostbyname(argv[1]);
if (!h) {
ulog_err("%s: Failed to get address of %s.\n", __func__,
argv[1]);
return -1;
}
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == -1) {
ulog_err("%s: Failed to create server socket", __func__);
return -1;
}
memcpy(&(sa.sin_addr.s_addr), h->h_addr_list[0], 4);
sa.sin_port = htons(atoi(argv[2]));
sa.sin_family = AF_INET;
if (connect(s, (struct sockaddr *)&sa, sizeof(sa))) {
ulog_err("%s: Failed to connect to %s:%s", __func__, argv[1],
argv[2]);
return -1;
}
do {
FD_ZERO(&rfds);
FD_SET(s, &rfds);
tv.tv_sec = 500;
tv.tv_usec = 0;
err = select(s+1, &rfds, NULL, NULL, &tv);
ulog("select: err: %d, errno: %d.\n", err, errno);
err = write(s, buf, sizeof(buf));
ulog("write: err: %d, errno: %d.\n", err, errno);
} while (err > 0);
FD_ZERO(&rfds);
FD_SET(s, &rfds);
tv.tv_sec = 500;
tv.tv_usec = 0;
err = select(s+1, &rfds, NULL, NULL, &tv);
ulog("on exit: select: err: %d, errno: %d.\n", err, errno);
}