2012-09-14 29 views
0

我正在嘗試使用C編寫服務器 - 客戶端套接字程序。我有關於如何使用定時器實現它的問題。我想要做的是建立一個服務器和客戶端之間的連接,並具有讀寫操作。我開始知道如何在服務器端使用'timeval'結構的select()。但是我應該在客戶端做些什麼,我可以在套接字上讀取固定的時間。在客戶端套接字程序中使用select()

+0

你能否解釋一下你的意思是什麼「的插座上的一段固定時間讀」?你想讓客戶只在有限的時間內連接嗎?或者如果客戶在一段時間內沒有收到任何東西,是否希望客戶超時? –

+0

你有什麼嘗試? https://www.google.ru/search?q=c+socket+select+tutorial –

回答

0

您可以在客戶端執行完全相同的操作,在select()系統調用的timeval結構中設置所需的超時時間。但是在客戶端,使用阻止模式更容易,並使用setsockopt()SO_TIMEOUT/SO_RCVTIMEO選項(無論在平臺上調用它)來控制超時。檢查男子有關頁面。

0

是準確的,如果你想用「setsockopt的」插座的小例子:

int mySocket; 
struct timeval tv = {0, 0}; // Init to 0 (Or set directly with your values) 

mySocket = socket(AF_INET, SOCK_STREAM, 0); 
// Set the timeout (If you don't have set directly values) 
tv.tv_sec = 10; 
tv.tv_usec = 0; 
// Set The Timeout On Socket RECV 
setsockopt(mySocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); 
// Set The Timeout On Socket SEND 
setsockopt(mySocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)); 
+0

//示例客戶端代碼 time_out.tv_sec = 15; // 15秒 time_out.tv_usec = 0; // 0毫秒 sockfd =套接字(AF_INET,SOCK_STREAM,0); n =連接(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); fgets(buffer,255,stdin); n =寫入(sockfd,buffer,strlen(buffer)); n =讀取(sockfd,buffer,255); 上面的示例代碼是我想要做的 - 連接到套接字'sockfd'上的服務器,並首先執行寫操作,然後執行讀操作。 read()必須等待15秒,然後超時,但不會。需要幫忙! – Richard

+0

好吧不要使用讀/寫,但發送/ recv功能,我想! http://linux.die.net/man/2/send http://linux.die.net/man/2/recv – AnyProblemHaveSolution