1. 程式人生 > >[linux C]使用select進行非阻塞socket通訊

[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操作的效能外,

linuxsocket程式設計 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 後引入非阻塞式通訊機制,伺服器程式接收客戶連線,客戶程式建立與伺服器的