[linux C]使用select進行非阻塞socket通訊
程式碼片:
fd_set save_fds; int sockfd; struct sockaddr_in serv_addr; //my address struct sockaddr_in client_addr; if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))== -1) { perror("socekt error"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERVERPORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); bzero(&(serv_addr.sin_zero),8); socklen_t sin_size = sizeof(struct sockaddr_in); assert(bind(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) == 0); FD_ZERO(&save_fds); FD_SET(sockfd,&save_fds); struct timeval timeout= {0,0}; //非阻塞就置0 while(1) { <span style="color:#FF0000;"> fd_set read_fds = save_fds;</span> int result = select(sockfd + 1, &read_fds, 0, 0, &timeout); if(result >0 ) { if(FD_ISSET(sockfd,&read_fds)) { bzero(revbuf,BUFSIZE); int ret = recvfrom(sockfd, revbuf, BUFSIZE, 0, (struct sockaddr*) &client_addr, &sin_size); if (ret > 0) { printf("receive buf is %s",revbuf); } } } sleep(1); //..... }
如果有多個待監聽到sockfd,就將其通過
FD_SET(sockfd,&save_fds);
新增到描述符集合中;然後通過
FD_ISSET(sockfd,&read_fds)
判斷哪個描述符可以讀取。
注意:
<span style="color:#FF0000;">fd_set read_fds = save_fds;</span>
好像沒有這段程式碼,程式執行之後不能成功監聽到傳送來的資料。暫時也不知道為什麼。
相關推薦
[linux C]使用select進行非阻塞socket通訊
程式碼片: fd_set save_fds; int sockfd; struct sockaddr_in serv_addr; //my address struct sockaddr_in client_addr; if((s
Java網路程式設計——使用NIO實現非阻塞Socket通訊
除了普通的Socket與ServerSocket實現的阻塞式通訊外,java提供了非阻塞式通訊的NIO API。先看一下NIO的實現原理。 從圖中可以看出,伺服器上所有Channel(包括ServerSocketChannel和Socket
java NIO 實現非阻塞socket通訊
java的nio為非阻塞式socket通訊提供瞭如下幾個類: Selector : 它是SelectableChannel物件的多路複用器,所有希望採用非阻塞方式進行通訊的channel都應該註冊到Selector物件。可以通過呼叫此類的open()
Java NIO 非阻塞socket通訊案例
NIO的特性:它以塊為基本單位處理資料,所有的資料都要通過緩衝區(Buffer)來進行傳輸。它有一個用來作為原始I/O操作的抽象通道(Channel)並提供了Selector的非同步網路介面。且支援將檔案對映到記憶體,以大幅提高I/O效率。 緩衝區中有3個重要
使用NIO實現非阻塞Socket通訊原理
剛學了NIO,寫一下自己的理解 網路通訊中,NIO提供了SocketChannel和ServerSocketChannel兩種不同的套接字通道來實現,可以設定阻塞與非阻塞兩種模式,為了實現高負載高併發都採取非阻塞的模式。通道是雙向的,可以同時在通道上傳送和讀取
Thinking in Java--使用NIO實現非阻塞Socket通訊
Java1.4提供了一種新的IO讀取方式,稱為NIO。NIO中使用了通道和緩衝器的概念,並且以塊的形式操作資料,這樣更接近作業系統IO操作的形式,提高了JavaIO的效率。NIO的核心類有兩個Channel和Buffer。但是其實除了提升了基本IO操作的效能外,
linux下socket程式設計 select實現非阻塞模式多臺客戶端與伺服器通訊
select函式原型如下: int select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select系統呼叫是用來讓我們的程式
基於非阻塞socket的多執行緒伺服器的實現------一個伺服器如何與多個客戶端進行通訊?
我們首先來看服務端(涉及非阻塞socket和多執行緒): #include <stdio.h> #include <winsock2.h> #include <windows.h> #pragma comment(li
C++ Windows非阻塞UDP通訊原始碼
UDP通訊中,recvfrom或recv等函式預設都是阻塞方式進行的,即如果沒有收到訊息,那麼程式會一直卡在recv()這個函式這裡,使得該執行緒不能進行後續的操作。但有時候我們需要該執行緒在有UDP資料傳送過來的時候才進行資料接收,而在其他時間該執行緒還有別的
Linux實驗全紀錄之 非阻塞型通訊程式框架
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<signal.h> #include<stdlib.h> void sigin
linux環境下C語言實現非阻塞方式讀取字串資料的串列埠測試程式,即串列埠工具的編寫
一、前言 1.1 關於串列埠測試工具,網上已經有整合好的應用程式提供大家使用,但其只提供功能介面,內部具體怎麼實現的還需要自己去探索; 1.2 關於串列埠通訊的測試程式在網上已經是數見不鮮,但也不排除很多是直接“參考”別人的(ctrl+c),而且很多程式
linux非阻塞socket教程
from :http://blog.csdn.net/devday/article/details/5296621 本文並非解釋什麼是非阻塞socket,也不是介紹socket API的用法, 取而代替的是讓你感受實際工作中的程式碼編寫。雖然很簡陋,但
非阻塞socket呼叫connect, epoll和select檢查連線情況示例
我們知道,linux下socket程式設計有常見的幾個系統呼叫: 對於伺服器來說, 有socket(), bind(),listen(), accept(),read(),write() 對於客戶端來說,有socket(),connect() 這裡主要要講的是客戶端
異步非阻塞socket的實現
print except 事件循環 port int 性能 run utf8 try 在學習使用scrapy爬蟲框架之前,需要了解一些基礎原理 我們知道HTTP請求是基於socket模塊進行發送和接受的,但是socket套接字的在使用的中存在著阻塞,不利用爬蟲的高性能運
基於Java NIO2實現的非同步非阻塞訊息通訊框架
原文傳送門 基於Java NIO2實現的非同步非阻塞訊息通訊框架 前奏 AIO應用開發 Future方式 Callback方式 Reader/Writer方式實現 執行緒池和Group PendingExceptio
golang中select實現非阻塞及超時控制
// select.go package main import ( "fmt" "time" //"time" ) func main() { //宣告一個channel ch := make(chan int) //宣告一個匿名函式,傳入一個引數整型
Java入門系列-25-NIO(實現非阻塞網路通訊)
還記得之前介紹NIO時對比傳統IO的一大特點嗎?就是NIO是非阻塞式的,這篇文章帶大家來看一下非阻塞的網路操作。 補充:以陣列的形式使用緩衝區 package testnio; import java.io.IOException; import java.io.RandomAccessFile; impo
非阻塞socket程式設計
一. 阻塞、非阻塞、非同步 阻塞:阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。該程序被標記為睡眠狀態並被排程出去。函式只有在得到結果之後才會返回。當socket工作在阻塞模式的時候, 如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。 非阻塞:非阻塞和阻塞的概念相
非阻塞socket與io多路複用(沒整理好)
非阻塞套接字 多人聊天客戶端 import socket server = socket.socket() server.setblocking(False) #設定非阻塞 server.bind("",6969) server.listen(5) clients = [ ] 存放連線進來的
非阻塞式通訊詳解
用ServerSocket 和Socket編寫伺服器和客戶端程式的時候,其在執行過程中往往是阻塞的。例如SeverSocket中的accept()方法,假如沒有客戶連線就一直處於阻塞狀態。JDK1.4 後引入非阻塞式通訊機制,伺服器程式接收客戶連線,客戶程式建立與伺服器的