我有一個現有的多線程應用程序,它使用阻塞connect()調用。套接字連接超時在c使用輪詢
但是,我想介紹應用程序的連接超時,如果服務器在x毫秒內沒有響應我們的查詢,應用程序將停止嘗試並給出錯誤。
但是,我無法弄清楚如何使用民意測驗。
@caf的非阻塞連接使用選擇有很大的幫助。 但我已經閱讀,選擇較慢比較民意調查,因此我想使用民意調查。你能告訴我這是真的嗎?
我從the post粘貼一行代碼,這裏
int main(int argc, char **argv) {
u_short port; /* user specified port number */
char *addr; /* will be a pointer to the address */
struct sockaddr_in address; /* the libc network address data structure */
short int sock = -1; /* file descriptor for the network socket */
fd_set fdset;
struct timeval tv;
if (argc != 3) {
fprintf(stderr, "Usage %s <port_num> <address>\n", argv[0]);
return EXIT_FAILURE;
}
port = atoi(argv[1]);
addr = argv[2];
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(addr); /* assign the address */
address.sin_port = htons(port); /* translate int2port num */
sock = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK);
connect(sock, (struct sockaddr *)&address, sizeof(address));
FD_ZERO(&fdset);
FD_SET(sock, &fdset);
tv.tv_sec = 10; /* 10 second timeout */
tv.tv_usec = 0;
if (select(sock + 1, NULL, &fdset, NULL, &tv) == 1)
{
int so_error;
socklen_t len = sizeof so_error;
getsockopt(sock, SOL_SOCKET, SO_ERROR, &so_error, &len);
if (so_error == 0) {
printf("%s:%d is open\n", addr, port);
}
}
close(sock);
return 0;
}
你能幫我使用輪詢來寫類似的功能。
我在RHEL上並使用gcc 4.5.x版本。
更新:對於當前代碼,一旦應用程序創建連接到服務器,如何將套接字更改爲阻止模式。我無法找到解除這個O_NONBLOCK的方法。 更新2:fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) & ~O_NONBLOCK);
One post指出我們可以用上面的命令做到這一點。雖然沒有得到登錄。
select對此完全沒問題。 –
我認爲民意調查和選擇都很慢。 [Check here。](http://daniel.haxx.se/docs/poll-vs-select.html) –
實際上,我需要構建solaris和Linux complienet代碼。因此我不能去epoll()。需要接受民意調查或選擇。 –