Linux網路編程一般用C語言,也用C++語言,因為有些網路編程的庫是C++的,所以C/C++編程基礎最起碼要有;另外基礎知識部分就是網路原理要學,還有Linux平台的基本編程技術(socket、文件相關的系統調用)。Linux網路編程基本上是一些編程技巧和代碼庫的運用以及編程經驗的積累,學習到一定程度了可以試著編寫一些網路伺服器程序。
2. linux select 怎麼理解
linux select函數詳解
在Linux中,我們可以使用select函數實現I/O埠的復用,傳遞給 select函數的參數會告訴內核:
•我們所關心的文件描述符
•對每個描述符,我們所關心的狀態。(我們是要想從一個文件描述符中讀或者寫,還是關注一個描述符中是否出現異常)
•我們要等待多長時間。(我們可以等待無限長的時間,等待固定的一段時間,或者根本就不等待)
從 select函數返回後,內核告訴我們一下信息:
•對我們的要求已經做好准備的描述符的個數
•對於三種條件哪些描述符已經做好准備.(讀,寫,異常)
有了這些返回信息,我們可以調用合適的I/O函數(通常是 read 或 write),並且這些函數不會再阻塞.
#include <sys/select.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
返回:做好准備的文件描述符的個數,超時為0,錯誤為 -1.
首先我們先看一下最後一個參數。它指明我們要等待的時間:
struct timeval{
long tv_sec; /*秒 */
long tv_usec; /*微秒 */
}
有三種情況:
timeout == NULL 等待無限長的時間。等待可以被一個信號中斷。當有一個描述符做好准備或者是捕獲到一個信號時函數會返回。如果捕獲到一個信號, select函數將返回 -1,並將變數 erro設為 EINTR。
timeout->tv_sec == 0 &&timeout->tv_usec == 0不等待,直接返回。加入描述符集的描述符都會被測試,並且返回滿足要求的描述符的個數。這種方法通過輪詢,無阻塞地獲得了多個文件描述符狀態。
timeout->tv_sec !=0 ||timeout->tv_usec!= 0 等待指定的時間。當有描述符符合條件或者超過超時時間的話,函數返回。在超時時間即將用完但又沒有描述符合條件的話,返回 0。對於第一種情況,等待也會被信號所中斷。
3. select語句
select distinct name from 表名
或select name from 表名 group by name
4. linux使用select()實現socket並發的一些問題,求給給思路
listen默認是同時5個鏈接收到連接後盡快accept,就可以再收5個了所以你的問題應該在於盡快把連接建立而不是考慮如何接收更多的等待連接
5. linux網路編程中如何實現伺服器端多個read()和客戶端write( )
TCP通信的模式如下圖,比較固定,對著圖編代碼就可以了:
因為客戶端沒有指定IP地址和埠,所以其IP和埠都是內核隨機分配的。
6. select是什麼意思
1,select,html 選擇標簽,頭文件#include <sys/select.h> 。
2,英文select【si'lekt】。 中文意思為選擇、挑選。這還是一條計算機SQL資料庫中中常用的函數。在網頁HTML中的select是個選擇對象。
3,select是一個英語單詞,可以用作及物動詞和形容詞,可以翻譯為選擇、挑選,等等。
4,select,html 選擇標簽,頭文件#include <sys/select.h> 。(Linux 網路編程)
7. linux網路編程,可以用select函數代替accept函數接收客戶端的connect請求嗎
select不可以替代accept,但可以用來作輔助,比如
nfds = select(Fd + 1, &fds, NULL, NULL , &tv);
if(nfds>0){
if (listenSock != -1 && FD_ISSET(listenSock, &fds))
{
if ((sock = accept(listenSock,(struct sockaddr *)&addr, &addrlen)) < 0)
{
return -1;
}
}
}
大概就這樣
8. 誰能告訴我 linux下select函數到底是干什麼用的 貌似我不用它也可以得到我想要的結果啊
select是用來設置超時時間的,其第一個參數本來是一個文件號,假如讀取該文件長時間沒有返回則超時跳出,而這部分代碼將文件號設置為0,說明只是為了控制延時不過看你這部分代碼,明顯只是實現一個比較精確定時的sleep這段代碼之所以這么做,是因為linux本身的sleep函數非常不準(windows也是一樣),在線程較多,cpu任務較重的時候,sleep函數的精確度根本無法達到要求於是你這段代碼使用select來代替sleep更為精準,其精準程度和內核相關,如果內核的滴答頻率決定的,一般是100HZ也有1000hz的(因內核版本不同而不同),也就是說select做多可以精確到10ms,或者1ms,而sleep就做不到於是這段函數最重要的作用就是用高精確的select函數來代替低精確度的sleep函數,實現時間較為精準的延時。可查閱《Linux就該這么學》了解更多Linux介紹。
9. Linux網路編程的介紹
《Linux網路編程》是2010年清華大學出版社出版的圖書,作者是宋敬彬、孫海濱。linux是目前最流行的開源操作系統,網路功能在linux下佔有核心的地位。本書循序漸進地從應用層到linux內核、從基本知識點到綜合案例,向讀者介紹如何在linux下進行網路程序設計。本書內容分為4個部分:linux程序設計基礎部分、linux用戶空間網路編程部分、linux內核網路編程部分以及綜合案例部分。內容包含linux系統概述、linux編程環境、linux文件系統簡介、linux下的進程和線程、tcp/ip協議族、應用層網路服務程序、tcp編程、主機信息獲取、數據io復用、udp編程、高級套接字、套接字選項、原始套接字、伺服器模型、ipv6、linux 內核網路部分結構及分布、netfilter框架內報文處理。
10. linux網路編程的I/O多路復用是怎麼回事該如何使用
linux網路編程的I/O 多路復用。select()函數是系統提供的,它可以在多個描
述符中選擇被激活的描述符進行操作。
例如:一個進程中有多個客戶連接,即存在多個TCP 套接字描述符。select()函數阻塞
直到任何一個描述符被激活,即有數據傳輸。從而避免了進程為等待一個已連接上的數據而
無法處理其他連接。因而,這是一個時分復用的方法,從用戶角度而言,它實現了一個進程
或線程中的並發處理。
I/O 多路復用技術的最大優勢是系統開銷小,系統不必創建進程、線程,也不必維護這
些進程/線程,從而大大減少了系統的開銷。
select()函數用於實現I/O 多路復用,它允許進程指示系統內核等待多個事件中的任何一
個發生,並僅在一個或多個事情發送或經過某指定的時間後才喚醒進程。
它的原型如下,
#include<sys/time.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set * errorfds, struct timeval *timeout);
ndfs: select() 函數監視描述符數的最大值。根據進程中打開的描述符數而定,一般設為要
監視的描述符的最大數加1。
readfds: select() 函數監視的可讀描述符集合。
writefds: select()函數監視的可寫描述符集合。
errorfds: select()函數監視的異常描述符集合。
timeout: select()函數超時結束時間
返回值。如果成功返回總的位數,這些位對應已准備好的描述符。否則返回-1,並在errno
中設置相應的錯誤碼。
FD_ZERO(fd_set *fdset):清空fdset 與所有描述符的聯系
FD_SET(int fd, fd_set *fdset):建立描述符fd 與fdset 的聯系
FD_CLR(int fd, fd_set *fdset):撤銷描述符fd 與fdset 的聯系
FD_ISSET(int fd,fd_set *fdset) ::檢查與fdset 聯系的描述符fd 是否可讀寫,返回非0表示可讀寫。
採用select()函數實現I/O 多路復用的基本步驟如下:
(1) 清空描述符集合
(2) 建立需要監視的描述符與描述符集合的聯系
(3) 調用select()函數
(4) 檢查所有需要監視的描述符,利用FD_ISSET 判斷是否准備好
(5) 對已准備好的描述符進行I/O 操作