非阻塞式Socket之select的DEMO實現

2021-09-29 04:02:34 字數 2232 閱讀 5641

select_server.c

#include #include #include #include #include //#include #define bool int

#define true 1

#define false 0

#define myport 8888

#define backlog 5 //how many pending connections queue will hold

#define buf_size 200

int fd_a[backlog]; //accepted connection fd

int conn_amount; //current connection amount

void showclient()

int main()

if (setsockopt(sock_fd, sol_socket, so_reuseaddr, &yes, sizeof(int)) == -1) //設定socket的屬性,socket關閉後立即收回 用以加強程式的健壯性

server_addr.sin_family = af_inet; //位址簇

server_addr.sin_port = htons(myport);

server_addr.sin_addr.s_addr = inaddr_any; //自動填充為本機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)) //開始監聽

printf("listen port %d\n", myport); //監聽成功

conn_amount = 0;

sin_size = sizeof(client_addr);

maxsock = sock_fd;

while (true)

}ret = select(maxsock + 1, &fdsr, null, null, &tv);

if (ret < 0)

else if (ret == 0)

//檢查集合內的每個socket連線

for (i = 0; i < conn_amount; i++)

else //輸出接收到的資料

printf("client[%d] send:%s\n", i, buf);}}

} //檢查是否有新連線接入

if (fd_isset(sock_fd, &fdsr))

//增加至佇列

if (conn_amount < backlog)

}else

}showclient();

} //關閉其他連線

for (i = 0; i < backlog; i++)

exit(0);

}

select_client.c

#include #include #include #include #define port 8888

int main(int argc, char **ar**)

if ((sock = socket(af_inet, sock_stream, 0)) < 0)

my_addr.sin_family = af_inet;

my_addr.sin_port = htons(port);

//位址賦值

if (inet_aton("127.0.0.1",(struct sockaddr *)&my_addr.sin_addr.s_addr) == 0)

//連線

if (connect(sock,(struct sockaddr *)&my_addr, sizeof(struct sockaddr)) < 0)

printf("ar**[1]:%s,len:%d\n", ar**[1], strlen(ar**[1]));

len = send(sock, ar**[1], strlen(ar**[1]) - 1,0);

if (len < 0)

sleep(1);

close(sock);

}

非阻塞式socket

返回錯誤ewouldblock或eagain。套接字的預設狀態是阻塞的。這就意味著當發出乙個不能立即完成的套接字呼叫時,其進 程將被投入睡眠,等待相應操作完成。可能阻塞的套接字呼叫可分為以下四類 1 輸入操作,包括read readv recv recvfrom和 recvmsg共5個函式。如果某個...

非阻塞式socket程式設計select

華清遠見嵌入式學院 上海中心講師。select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如 connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這...

非阻塞式socket程式設計(select )

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...