您好,登錄后才能下訂單哦!
socket()
#include <sys/types.h>
#include <socket.h>
int socket(int domain,int type,int protocol)
返回值:成功返回一個文件描述符(注意,這個套接字不能用于和用戶進行通信,只能用于listen和accept客戶端的連接請求),失敗返回-1
參數:
domain
AF_INET IPv4 Internet protocols
type
SOCK_STREAM 可以提供測序、可靠的雙向,字節流
SOCK_DGRAM 支持數據報(無連接、不可靠消息的一個固定的最大長度)
protocol
can be specified as 0
bind()
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
返回值:成功返回0,失敗返回-1
描述:
當創建一個套接字,它存在于一個名稱空間(家庭地址),但沒有地址分配給它。bind()將指定的地址賦給addr的套接字sockfd提到的文件描述符。addrlen,以字節為單位,指出通過addr的地址結構。傳統上,這個操作稱為“將一個名稱分配給一個套接字”。
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
};
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
listen()
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
返回值:成功返回0,失敗返回-1
參數:
backlog
待辦事項列表參數定義等待連接的隊列的最大長度為sockfd可能增長。如果一個連接請求到達隊列滿時,客戶端可能會收到一個錯誤的指示ECONNREFUSED或者,如果底層協議支持重傳,請求可能會被忽略,這樣在連接成功后再嘗試。
accept()
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
描述:
accept()函數創建并返回了一個新的套接字client_sock,用于與客戶端通信。
假設一共有3個客戶端連接到服務器端。那么在服務器端就一共有4個套接字:第1個是socket()返回的、用于監聽的套接字;其余3個是分別調用3次accept()返回的不同的套接字。
send()
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
返回值:
>0 數據發送成功
<=0 發送失敗需要重試
參數:
前三個參數等同于write
sockfd:發送端套接字描述符;
buf:發送端的發送緩沖區,用來暫時存放要發送的數據;
len:要發送數據的長度;
第四個參數flag的參數值說明:
flag一般設為0
描述:
send先檢查發送端要發送數據的長度len和sockfd發送緩沖區的長度,如果len>sockfd發送緩沖區的長度,函數返回SOCKET_ERROR;
如果len<=發送端緩沖區的長度,send就先檢查協議是否正在發送 發送緩沖區的數據,如果協議正在發送數據,則send等待協議發完數據,如果此時協議還沒有開始發送sockfd發送緩沖區的數據或者該緩沖區為空,那么send就比較len和sockfd發送緩沖區剩下的長度;
如果len>sockfd發送緩沖區的剩余長度,send就等待協議把發送緩沖區上的數據發送完畢,如果len<發送緩沖區的剩余長度,send就把buf中的數據copy到sockfd發送緩沖區的剩余空間里;
如果send函數copy成功,則返回實際拷貝的字節數,否則返回SOCKET_ERROR;send函數把數據copy到sockfd發送緩沖區后就返回了,此時這些數據不一定被對端收到了(因為數據的傳輸是由協議來完成的,send在copy之后就返回了),如果協議在傳輸數據的過程中出現網絡錯誤的話,下一個send函數將出錯返回SOCKET_ERROR;
每一個send在copy數據的時候都要等待上一個數據被協議傳輸到連接的另一端,如果協議在傳輸數據的過程,網絡中斷或出現異常,send函數就會返回SOCKET_ERROR.
recv()
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
返回值:
<0 出錯
=0 對方關閉了連接
>0 接收到數據的字節數
參數:
前三個參數等同于read
sockfd:接收端套接字描述符
buf:接收端接收緩沖區,存放
len:buf的長度
第四個參數和send()的一樣,一般置為0
connect()
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
參數:
sockfd:主動建立連接請求的套接字
addr:用來保存服務器端的端口號、ip地址
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。