socket程式設計中的超時設定示例詳解之二

2021-06-14 17:59:09 字數 1888 閱讀 3627

接前文

​二、操作(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等.更多關於阻塞 非阻塞,同步 非同步的講解可以參見我總結的相關專題文章 簡單分類的話...