使用select函式可以以非阻塞的方式和多個socket通訊。程式只是演示select函式的使用,功能非常簡單,即使某個連線關閉以後也不會修改當前連線數,連線數達到最大值後會終止程式。
1. 程式使用了乙個陣列fd_a,通訊開始後把需要通訊的多個socket描述符都放入此陣列。
2. 首先生成乙個叫sock_fd的socket描述符,用於監聽埠。
3. 將sock_fd和陣列fd_a中不為0的描述符放入select將檢查的集合fdsr。
4. 處理fdsr中可以接收資料的連線。如果是sock_fd,表明有新連線加入,將新加入連線的socket描述符放置到fd_a。
#include
<
stdio.h
>
#include
<
stdlib.h
>
#include
<
unistd.h
>
#include
<
errno.h
>
#include
<
string
.h>
#include
<
sys/
types.h
>
#include
<
sys/
socket.h
>
#include
<
netinet/in
.h>
#include
<
arpa
/inet.h
>
#define
myport 1234
//the port users will be connecting to
#define
backlog 5
//how many pending connections queue will hold
#define
buf_size 200
intfd_a[backlog];
//accepted connection fd
intconn_amount;
//current connection amount
void
showclient()
printf(
"\n\n");
}int
main(
void)if
(setsockopt(sock_fd, sol_socket, so_reuseaddr,
&yes,
sizeof
(int
)) ==-1
) server_addr.sin_family
=af_inet;
//host byte order
server_addr.sin_port
=htons(myport);
//short, network byte order
server_addr.sin_addr.s_addr
=inaddr_any;
//automatically fill with my ip
memset(server_addr.sin_zero, '\0
', sizeof
(server_addr.sin_zero));
if(bind(sock_fd, (
struct
sockaddr *)
&server_addr,
sizeof
(server_addr)) ==-
1) if(listen(sock_fd, backlog) ==-
1) printf(
"listen port %d\n
", myport);
fd_set fdsr;
intmaxsock;
struct
timeval tv;
conn_amount =0
;sin_size
=sizeof
(client_addr);
maxsock
=sock_fd;
while(1
) }ret
=select(maxsock +1
, &fdsr, null, null,
&tv);
if(ret
<
0)
else
if(ret ==0
) //
check every fd in the set
for(i =0
; i
<
conn_amount; i
++)
else}}
//check whether a new connection comes
if(fd_isset(sock_fd,
&fdsr))
//add to fd queue
if(conn_amount
<
backlog)
else
}showclient();}//
close other connections
for(i =0
; i
<
backlog; i
++)
}exit(0);
}
SEL的簡單解釋
sel就是對方法的一種包裝。包裝的sel型別資料它對應相應的方法位址,找到方法位址就可以呼叫方法 1.方法的儲存位置 2.sel物件的建立 sel s1 selector test1 將test1方法包裝成sel物件 sel s2 nsselectorfromstring test1 將乙個字串方法...
linux socket 程式設計
兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...
linux socket程式設計
雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...