1. 程式人生 > >將ACCEPT改成非阻塞型

將ACCEPT改成非阻塞型

這個專案中寫的程式是與遠端進行SOCKET通訊,用到ACCEPT來接受遠端的連線請求,一直以來在程式裡對ACCEPT用的都是阻塞方式,接收到一個新的連線請求後,就建立一個新的執行緒處理與客戶端的通訊任務。今天由於需要實現伺服器端設定客戶端心跳包週期的功能,如果每個執行緒都去查詢資料庫裡心跳包週期有沒有發生改變,實現起來太麻煩,就改用使用主執行緒去查詢資料庫裡存放的心跳包週期,由於主執行緒需要不停地去查詢資料庫,這樣ACCEPT就不能再用阻塞的方式,上網搜了一下,沒找到什麼方法,突然想到我以前recev資料包也是用的阻塞方式,後來用select改為了非阻塞方式,ACCEPT能不能也用select實現非阻塞方式呢?自己試著按照recev的非阻塞方式改了一下程式,ACCEPT成功實現了非阻塞接收連線請求方式。

    int maxfdp=NULL;
    struct fd_set fds;
    struct timeval timeOut={0,1};
    FD_ZERO(&fds);
    FD_SET(sock_sev,&fds);
    if (select(maxfdp,&fds,NULL,NULL,&timeOut))
    {       
         cout<<"new connection"<<endl;
		   sock_client = accept(sock_sev, (sockaddr *)&addr_client, &nAddrLen);
	       if (INVALID_SOCKET == sock_client)
		   {
		       std::cout << "Failed to accept." << std::endl;
			   continue;
		   }
		   socketClient[i].socketConn=sock_client;
		   std::cout << "Connection from " << inet_ntoa(addr_client.sin_addr)<< std::endl;
		   socketClient[i].ClientID=i;
		   socketClient[i].socketThread=CreateThread(NULL,0,ThreadRead,&socketClient[i],0,socketClient[i].ThreadID);
		   i++;
	   }
     




相關推薦

ACCEPT阻塞

這個專案中寫的程式是與遠端進行SOCKET通訊,用到ACCEPT來接受遠端的連線請求,一直以來在程式裡對ACCEPT用的都是阻塞方式,接收到一個新的連線請求後,就建立一個新的執行緒處理與客戶端的通訊任務。今天由於需要實現伺服器端設定客戶端心跳包週期的功能,如果每個執行緒都去

域名https協議

在百度雲買的域名,今天打算申請下ssl證書,把域改成https訪問 首先申請ssl證書,我申請的是symantec,不要錢。 申請好後下載證書,百度雲下載的是一個crt和一個key檔案。 把證

Linux實驗全紀錄之 阻塞通訊程式框架

#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<signal.h> #include<stdlib.h> void sigin

DNS8 8 8 8有什麼利與弊

                如果DNS伺服器設定不當,可能會導致網速慢、彈窗廣告、網址打不開、開啟不是自己想要的網站、

mysql通過orunion來優化sql效能問題一例

某系統測試環境有支SQL執行時間較長,開發人員請求dba協助優化。 原SQL如下: SELECT   g.id,           ----省略-----     FROM    g,             y,             t,             o

DataTable轉換List泛集合助手類

將DataTable轉換成List<T>泛型集合助手類,這個類我放在了Entity實體類層中: [csharp] using System; using System.Collections.Generic; using System.Linq; us

伺服器程式設計心得(四)—— 如何socket設定為阻塞模式

1. windows平臺上無論利用socket()函式還是WSASocket()函式建立的socket都是阻塞模式的: SOCKET WSAAPI socket( _In_ int af, _In_ int type, _In_ int protocol )

[linux] socket設定為阻塞(non-blocking)

原文:http://blog.csdn.net/wwwsq/article/details/970198 有一個非常有迷惑性的做法是:u_long has = 1;ioctl(m_sock, FION

linux用搜狗輸入法後,只能預設中文,終端英文

linux用搜狗輸入法後,只能預設中文 在安裝搜狗輸入法後,由於搜狗的預設是中文,所以不管開啟什麼,一開始輸入的都是中文,但是使用linux除了在網頁搜尋時使用中文,大多數時候,比如開啟終端都是英文命令,每次都要切換太麻煩,如何才能在每次開啟終端的時候,都預設

get請求返回的是字串,字典

(void)loginBtnClick:(id)sender{ AFHTTPRequestOperationManager *manager = [AFHTTPRequestOp

chown的許可權限制--普通使用者無法owner其他使用者,如root

[email protected]:~$ chown root motd chown: changing ownership of `motd': Operation not permitted [email protected]:~$ chown

Android Studio ActivityFragment

lse navig ive art tools ins schema 1.0 this 項目中遇到一個尷尬的問題,因為初學Android,所以用了大量Activity,但現在想要改成Fragment,但是Activity太多,感覺很頭大,研究了很久怎麽改,沒有看到合適的文章

Linux 設備驅動--- 阻塞字符設備驅動 --- O_NONBLOCK --- 阻塞標誌【轉】

ble 進程阻塞 例如 缺省 tracking 問題 href 字符驅動 調度 轉自:http://blog.csdn.net/yikai2009/article/details/8653697 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目

JavaSE8基礎 Integer構造方法 符合標準的String類int類

light 方法 win 異常 javase png integer 基礎 pre os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0)

方便的數字轉字符串類並在前面補0

python有的時候需要將數字轉化成字符串來保存或使用。一般可以直接使用或者用str()轉一個數據類型就好了。但是有的時候對數字位數有要求,不足的位數前面用0補齊。比如1需要變成"01"或"001",處理類似工號的時候可能會有這種需求。當然實現起來並不難,不過如何可以更加簡潔方便的實現,而不是寫一大堆的判斷語

後端實現int類相應的Sting字符串

limit shm util setname add detach lis col 類型 private void util_setName(JSONArray jsonArray){ // JSONObject stationJson = insp

FTP(三)FTP服務獨立服務方式運行

FTP將FTP服務改為非獨立服務方式運行 "此方法只針對CentOS6可用,CentOS7默認就是非獨立服務" 1,需要安裝xinetd服務 yum install xinetd 2,修改FTP主配置文件 vim /etc/vsftpd/vsftpd.conf

如何Object類轉換String類

lba plain pub help eight 代碼 tle 能夠 try 1. Object.toString()?1obj.toString()註意:必須保證Object不是null值,否則將拋出NullPointerException異常。 2. (String)O

時間類的數據轉換string類的數據

js datetime stringfunction dateToString(datetime) { // 獲取年份 var year = datetime.getFullYear(); // 獲取月份 從0開始的 var month = datetime.getMonth

服務器編程心得(四)—— 如何socket設置為阻塞模式

led -h bsp wait per 設置 inux sign 也有 1. windows平臺上無論利用socket()函數還是WSASocket()函數創建的socket都是阻塞模式的: SOCKET WSAAPI socket( _In_ int af,