#include #include #include #include #include #include #include #include #include #include #define TRUE 0 #define FALSE -1 #define TCP_LEN 1492 /* TCP/IP 送受信長 */ int m_timeout = 0; /* IE 切断後の再 READ のタイムアウト秒 */ void main(void){ int sockfd, on = 1, rc, port = 3010; struct sockaddr_in iaddr; int iaddrlen = sizeof(iaddr); struct timeval timeout; fd_set read_fd; char buff[TCP_LEN+1]; printf("** TESTSEL: select のテスト・サンプル **\n"); getchar(); m_timeout = 30; /* 30 秒のタイムアウト */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); memset(&iaddr, 0, sizeof(struct sockaddr_in)); iaddr.sin_port = htons(port); iaddr.sin_family = AF_INET; iaddr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd, (struct sockaddr*)&iaddr, sizeof(iaddr)); FD_ZERO(&read_fd); FD_SET(sockfd, &read_fd); timeout.tv_sec = m_timeout; timeout.tv_usec = 0; printf("** select 待機中 **\n"); rc = select(sockfd+1, &read_fd, NULL, NULL, &timeout); if(rc < 0){/* select 失敗 */ fprintf(stderr, "%d:SELECT 失敗 :%s", __LINE__, strerror(errno)); close(sockfd); getchar(); exit(-1); }/* select 失敗 */ if(FD_ISSET(sockfd, &read_fd)){ } else{/* NODATA-TIMEOUT */ printf("%d 秒の受信待機はタイムアウトで終了しました。 \n", m_timeout); close(sockfd); getchar(); exit(-1); }/* NODATA-TIMEOUT */ printf("** recvfrom 開始 **\n"); rc = recvfrom(sockfd, buff, TCP_LEN, 0, (struct sockaddr*)&iaddr, &iaddrlen); if(rc < 0){/* recvfrom error */ fprintf(stderr, "%d:recvfrom error:%s\n", __LINE__,strerror(errno)); }/* recvfrom error */ else{/* 正常に受信 */ }/* 正常に受信 */ printf("%d: %d バイトを受信しました。 \n", __LINE__, rc); close(sockfd); getchar(); exit(0); }