當前位置:編程學習大全網 - 編程語言 - accept函數的用法

accept函數的用法

accept()函數

準備好了,系統調用 accept() 會有點古怪的地方的!妳可以想象發生 這樣的事情:有人從很遠的地方通過壹個妳在偵聽 (listen()) 的端口連接 (connect()) 到妳的機器。它的連接將加入到等待接受 (accept()) 的隊列 中。妳調用 accept() 告訴它妳有空閑的連接。它將返回壹個新的套接字文 件描述符!這樣妳就有兩個套接字了,原來的壹個還在偵聽妳的那個端口, 新的在準備發送 (send()) 和接收 ( recv()) 數據。這就是這個過程!

函數是這樣定義的:

#include <sys/socket.h>

int accept(int sockfd, void *addr, int *addrlen);

sockfd 相當簡單,是和 listen() 中壹樣的套接字描述符。addr 是個指 向局部的數據結構 sockaddr_in 的指針。這是要求接入的信息所要去的地 方(妳可以測定那個地址在那個端口呼叫妳)。在它的地址傳遞給 accept 之 前,addrlen 是個局部的整形變量,設置為 sizeof(struct sockaddr_in)。 accept 將不會將多余的字節給 addr。如果妳放入的少些,那麽它會通過改

變 addrlen 的值反映出來。

同樣,在錯誤時返回-1,並設置全局錯誤變量 errno。

現在是妳應該熟悉的代碼片段。

#include <string.h>

#include <sys/socket.h>

#include <sys/types.h>

#define MYPORT 3490 /*用戶接入端口*/

#define BACKLOG 10 /* 多少等待連接控制*/

main()

{

int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */

struct sockaddr_in my_addr; /* 地址信息 */

struct sockaddr_in their_addr; /* connector's address information */

int sin_size;

sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 錯誤檢查*/

my_addr.sin_family = AF_INET; /* host byte order */

my_addr.sin_port = htons(MYPORT); /* short, network byte order */

my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */

bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */

/* don't forget your error checking for these calls: */

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

listen(sockfd, BACKLOG);

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, &their_addr, &sin_size);

.

.

.

註意,在系統調用 send() 和 recv() 中妳應該使用新的套接字描述符 new_fd。如果妳只想讓壹個連接進來,那麽妳可以使用 close() 去關閉原 來的文件描述符 sockfd 來避免同壹個端口更多的連接。

  • 上一篇:macOS上罕見的免費攔截工具
  • 下一篇:電力設備的絕緣工具及儀器有哪些?
  • copyright 2024編程學習大全網