使用者態對accept的標準使用方法:
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
sockfd是通過socket系統呼叫,而且經過listen過的套接字:
sockfd = socket(af_inet, sock_stream, 0)
listen(sockfd, 128)
remote_addr將會儲存遠端裝置的位址資訊。
/* * for accept, we attempt to create a new socket, set up the link
* with the client, wake up the client, then return the new
* connected fd. we collect the address of the connector in kernel
* space and move it to user at the very end. this is unclean because
* we open the socket then return an error.
* * 1003.1g adds the ability to recvmsg() to query connection pending
* status to recvmsg. we need to add that support in a way thats
* clean when we restucture accept also.
*/asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
int __user *upeer_addrlen)
//使得這個newsock繫結剛才新建的newfile
//即如今為止,newfd newfile newsock之間是有關聯的
err = sock_attach_fd(newsock, newfile);
if (err < 0)
goto out_fd_******;
err = security_socket_accept(sock, newsock);
if (err)
goto out_fd;
//newsock是socket結構體,sock->ops->accept的目的是為newsock關聯乙個sock結構體
//即三次握手結束後,新建的sock傳輸控制塊,它等待使用者accept系統呼叫「領養」它。
//sock->ops->accept相應的函式是inet_accept
err = sock->ops->accept(sock, newsock, sock->file->f_flags);
if (err < 0)
goto out_fd;
if (upeer_sockaddr)
err = move_addr_to_user(address, len, upeer_sockaddr,
upeer_addrlen);
if (err < 0)
goto out_fd;
}.........................................}/*
* accept a pending connection. the tcp layer now gives bsd semantics.
*/int inet_accept(struct socket *sock, struct socket *newsock, int flags)
/* * this will accept the next outstanding connection.
*///inet_csk_accept的功能時獲取建立3次握手後的sk,一次呼叫返回乙個sk
struct sock *inet_csk_accept(struct sock *sk, int flags, int *err)
//reqsk_queue_get_child的邏輯是:
//1:取出icsk_accept_queue的request_sock,然後取出request_sock中的sk
//2:listen的sk中,sk_ack_backlog計數減一,sk->sk_ack_backlog--,由於sk_ack_backlog有上限。
//3:刪除request_sock
//4:return取出的sk
newsk = reqsk_queue_get_child(&icsk->icsk_accept_queue, sk);
warn_on(newsk->sk_state == tcp_syn_recv);
out:
release_sock(sk);
return newsk;
out_err:
newsk = null;
*err = error;
goto out;
}
tcp listen呼叫和accept呼叫
在看listen的 之前.我們也先來看相關的資料結構 inet connection sock它包含了乙個icsk accept queue的域,這個域是乙個request sock queue型別,我們就先來看這個結構 request sock queue也就表示乙個request sock佇列....
核心新增系統呼叫
在 windows 下新增系統呼叫不像 linux 那樣容易,windows 系統呼叫與使用者程式之間還有 ntdll.dll 層,而這一層微軟沒有提供源 但是我們從系統呼叫的實現機制出發,不管是在 linux 還是windows 系統呼叫的實現都是通過中斷來實現的,可以利用中斷的方式呼叫新新增的系...
linux核心之系統呼叫
應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...