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,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...