接前文
二、操作(send, recv)超時
對它們有兩種方式來設定超時,
1. 將send, recv設定成非阻塞模式,然後用select來設定超時機制,就如上面的connect方式一樣。
2. 使用setsockopt()函式來設定相應的超時機制。
因為前一種方式在connect中重點說明,本節來主要說明第二種方式。
示例**如下:
對send和recv進行了超時設定,並最多做四次重試
/** \brief
* tcp client
*/#include
#include
#include
#include
#include
#include
#define timeout_time 2
#define servport 8080
#define maxdatasize 100
int main(int argc, char *argv);*/
struct sockaddr_in server_addr;
/* timeout */
struct timeval timeout;
socklen_t len = sizeof(timeout);
int result;
int error;
int i;
if (argc < 3)
*snd_buf = '\0';
strcat(snd_buf, argv[2]);
if ((sockfd = socket(af_inet, sock_stream, 0)) == -1)
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(servport);
inet_pton(af_inet, argv[1], &server_addr.sin_addr);
memset(&(server_addr.sin_zero), 0, 8);
/* create the connection by socket
* means that connect "sockfd" to "server_addr"
*/if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
/* send 超時設定,並最多做四次重試 */
timeout.tv_sec = timeout_time;
timeout.tv_usec= 0;
result = setsockopt(sockfd, sol_socket, so_sndtimeo, (char*)&timeout.tv_sec, len);
if (result < 0)
for(i = 0; i < 4; i++)
}else
}printf("send:%s\n", snd_buf);
/* recv 超時設定,並最多做四次重試 */
timeout.tv_sec = timeout_time;
timeout.tv_usec= 0;
result = setsockopt(sockfd, sol_socket, so_rcvtimeo, (char*)&timeout.tv_sec, len);
if (result < 0)
for(i = 0; i < 4; i++)
}else
}rcv_buf[recvbytes] = '\0';
printf("recv:%s\n", rcv_buf);
close(sockfd);
return 0;}
socket 超時設定
在send recv 過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制 這樣做在linux環境下是不會產生效果的,須如下定義 struct timeval timeout 設定傳送超時 setsockopt socket,sol socket,so sndtimeo,char ti...
socket超時設定
在使用socket程式設計時,肯定會遇到設定超時的問題。有些人可能會認為socket類的setsotimeout sotimeout 方法就是設定超時。其實不然,socket設定超時分為兩種,上面提到為讀寫超時。第一 建立連線的超時設定,如下 socket.connect socketaddress...
socket程式設計中的超時設定示例詳解之一
簡介 所謂阻塞模式,是指其完成指定的操作之前阻塞當前的程序或執行緒,直到操作有結果返回.在我們直接呼叫socket操作函式時,如果不進行特意宣告的話,它們都是工作在阻塞模式的,如 connect,send,recv等.更多關於阻塞 非阻塞,同步 非同步的講解可以參見我總結的相關專題文章 簡單分類的話...