日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API

發(fā)布時(shí)間:2025/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://home.eeworld.com.cn/my/space-uid-162102-blogid-52270.html

2011

原文:

關(guān)于BSD Socket API

在網(wǎng)上找到的兩個(gè)網(wǎng)站,是關(guān)于BSD Sockets API的,這是與lwIP在Socket模式下兼容的。里面對API函數(shù)做了較為詳細(xì)的介紹,先記下來,有空翻譯一下

-------------------------------------------------------------------------------------

最常用的BSD API函數(shù):

socket:創(chuàng)建一個(gè)插口(socket)

bind:將本地端口號和IP地址綁定到插口上

listen:TCP監(jiān)聽

accept:TCP監(jiān)聽接受處理

connect:TCP客戶端連接

select:特殊插口設(shè)置

send/sendto:發(fā)送數(shù)據(jù)包到已連接/未連接插口上

recv/recvfrom:接收數(shù)據(jù)包從已連接/未連接插口上

getsockopt/setsockopt:獲取/改變插口選項(xiàng)

getpeername/getsockname:獲取遠(yuǎn)端/本地地址信息

close:關(guān)閉插口

shutdown:按設(shè)置關(guān)閉插口

gethostbyname/gethostbyaddr:地址域名映射

read:從插口緩存讀數(shù)據(jù)

write:想插口緩存寫數(shù)據(jù)

-------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------

#include

#include

int socket( int domain, int type, int protocol );

創(chuàng)建通訊用的“插口”(插口socket可以理解為IP地址和端口號組合成的地址),創(chuàng)建成功返回插口ID(出錯(cuò)返回-1)。

參數(shù):domain協(xié)議族(AF_UNIX是UNIX,AF_INET是IPv4協(xié)議,AF_ROUTE是路由器協(xié)議);type類型(SOCK_STREAM是TCP,SOCK_DGRAM是UDP,SOCK_RAW是RAM活I(lǐng)Pv4);protocol為0。

該函數(shù)返回大于等于0的整數(shù)作為插口ID,如果出錯(cuò)返回-1

-------------------------------------------------------------------------------------

#include #include

int bind ( int sockFd, const struct sockaddr *sockAddr, int addrLen );

將插口名、本地端口號和本地IP地址綁定到指定插口上。一般在用作服務(wù)器時(shí)使用該函數(shù)。返回0成功,-1未成功。

參數(shù):sockFd插口ID,由socket函數(shù)創(chuàng)建;sockAddr結(jié)構(gòu)體包含插口地址信息,AF_UNIX用下面結(jié)構(gòu)體

struct sockaddr {

unsigned short sa_family;???? // Address Family (domain)

char?????????? sa_data[14]]; // Protocol Address

};

AF_INET用下面的結(jié)構(gòu)體,使用前需初始化,下面使用TCP函數(shù)時(shí)相同。

struct sockaddr_in {

short????????? sin_family;??? // Address Family

unsigned short sin_port;????? // Port Number

struct in_addr sin_addr;????? // Internet Address

unsigned char sin_zero[8];?? // Pad structure

};

addrLen是上述結(jié)構(gòu)體長度。

-------------------------------------------------------------------------------------

#include

int listen( int sockFd, int backlog );

TCP服務(wù)器監(jiān)聽指定插口

參數(shù):sockFd已創(chuàng)建并被綁定的插口;backlog允許接收的客服端數(shù)量。

-------------------------------------------------------------------------------------

include

#include

int accept ( int sockFd, struct sockaddr *clientAddr, int *addrLen )

TCP服務(wù)器監(jiān)聽到連接時(shí)的響應(yīng)函數(shù)。

參數(shù):sockFd已創(chuàng)建、綁定并監(jiān)聽的插口;clientAddr遠(yuǎn)端連接信息;addrLen結(jié)構(gòu)體長度。

-------------------------------------------------------------------------------------

#include

#include

int connect ( int sockFd, struct sockaddr *servAddr, int addrLen );

TCP/UDP客服端申請TCP/UDP服務(wù)器的鏈接。

參數(shù):sockFd已創(chuàng)建的插口;servAddr服務(wù)器連接信息;addrLen結(jié)構(gòu)體長度。

返回0成功,-1出錯(cuò)

-------------------------------------------------------------------------------------

#include

#include

#include

int select( int n, fd_set *read_fds, fd_set *write_fds,

fd_set *exceptfds, struct timeval *timeout );

掛起當(dāng)前線程,等待特定事件發(fā)生或定時(shí)器過期。本函數(shù)可以指定4類特定事件:read、write、exception和超時(shí)。返回插口ID表示事件有響應(yīng),0表示超時(shí),-1表示出錯(cuò)。

參數(shù):n應(yīng)該大于所有插口ID,用FD_SETSIZE代替;后面三個(gè)fd_set結(jié)構(gòu)體存儲三種插口事件位圖:

typedef struct fd_set {

fd_mask fds_bits[(FD_SETSIZE + NFDBITS - 1) / NFDBITS];

} fd_set;

用以下四個(gè)宏修改:

FD_SET(fd, fdset) fd插口ID,fdset是fd_set結(jié)構(gòu)體地址,設(shè)置插口事件為真

FD_CLR(fd, fdset)設(shè)置插口事件為假

FD_ISSET(fd, fdset)獲取插口狀態(tài),是否設(shè)置

FD_ZERO(fdset)清除所有設(shè)置

第四個(gè)參數(shù)timeval結(jié)構(gòu)體如下:

struct timeval {

int tv_sec;????? /* 秒 */

int tv_usec;???? /* 毫秒 */

};

用來設(shè)置超時(shí)時(shí)間。

-------------------------------------------------------------------------------------

#include

#include

int send ( int sockFd, const void *msg, int msgLen, unsigned int flags);

int sendto ( int sockFd, const void *msg, int msgLen, unsigned int flags,

const struct sockaddr *to, int toLen);

這兩個(gè)函數(shù)都用來按插口發(fā)送數(shù)據(jù)包,send用在已經(jīng)連接的插口,sendto用在沒有連接上的插口。

send函數(shù)的參數(shù):sockFD插口ID,msg要發(fā)送的數(shù)據(jù)指針,msgLen要發(fā)送的數(shù)據(jù)長度,flags發(fā)送選項(xiàng)(按位)

sendto函數(shù)的參數(shù):UDP專用,插口必須是SOCK_DGRAM類型。由于沒有連接,所以sendto函數(shù)增加了兩個(gè)與連接有關(guān)的參數(shù)。to定義目標(biāo)地址的結(jié)構(gòu)體,toLen是結(jié)構(gòu)體長度。sockaddr結(jié)構(gòu)體如下:

struct sockaddr {

u_short sa_family;

char sa_data[14];

};

這兩個(gè)函數(shù)返回值均為實(shí)際發(fā)送字節(jié)的長度(軟件需要調(diào)整偏移量將數(shù)據(jù)全部發(fā)送),-1表示發(fā)送不成功。

-------------------------------------------------------------------------------------

#include

#include

int recv ( int sockFd, const void *msg, int msgLen, unsigned int flags);

int recvfrom ( int sockFd, const void *msg, int msgLen, unsigned int flags,

const struct sockaddr *from, int *fromLen);

這兩個(gè)函數(shù)均是按插口來接收數(shù)據(jù)包,recv函數(shù)用在已連接插口上,recvfrom用在未連接插口上。

recv函數(shù)參數(shù):sockFd插口ID,msg接收緩存地址,msgLen接收緩存最大空間,flags接收選項(xiàng)。

recvfrom函數(shù)參數(shù):UDP專用,插口必須是SOCK_DRAM類型。由于沒有連接,所以recvfrom函數(shù)增加了兩個(gè)與連接有關(guān)的參數(shù)。from定義目標(biāo)地址的結(jié)構(gòu)體,formLen是結(jié)構(gòu)體長度。

兩個(gè)函數(shù)均返回接收到的數(shù)據(jù)數(shù),-1接收錯(cuò)誤,0表示目標(biāo)地址已經(jīng)傳輸完畢并關(guān)閉連接。

-------------------------------------------------------------------------------------#include

#include

int setsockopt ( int sd, int level, int optname, const void *optval, socklen_t optlen);

int getsockopt ( int sd, int level, int optname, void *optval, socklen_t *optlen );setsockopt函數(shù)用來改變插口的模式,這種改變是通過修改插口選項(xiàng)實(shí)現(xiàn)的。getsockopt函數(shù)用來獲取插口選項(xiàng)的值。參數(shù):sd插口ID;level協(xié)議棧選項(xiàng),包括SOL_SOCKET(插口層)、IPPROTO_TCP(TCP層)和IPPROTO_IP(IP層);optname需要修改的選項(xiàng)名;optval修改值地址;optlen修改值長度。返回0表示成功。-------------------------------------------------------------------------------------#include int getsockname ( int sd, struct sockaddr *addr, int *addrLen );int getpeername ( int sd, struct sockaddr *addr, int *addrLen );getsockname函數(shù)用于從已連接的插口中獲取本地地址信息。getpeername函數(shù)用于獲取遠(yuǎn)端地址信息。參數(shù):sd插口ID;addr地址信息結(jié)構(gòu)體;addrLen結(jié)構(gòu)體長度。返回0成功,-1錯(cuò)誤-------------------------------------------------------------------------------------#include int close ( int sd );關(guān)閉插口通信(丟棄未發(fā)送的數(shù)據(jù)包并拒絕接受數(shù)據(jù))-------------------------------------------------------------------------------------#include int shutdown ( int sockFd, int how );該函數(shù)提供了更大的權(quán)限控制插口的關(guān)閉過程。參數(shù):sockFd插口ID;how僅能為0、1和2這三個(gè)值0表示停止接收當(dāng)前數(shù)據(jù)并拒絕以后的數(shù)據(jù)接收1表示停駛發(fā)送數(shù)據(jù)并丟棄未發(fā)送的數(shù)據(jù)2是0和1的合集-------------------------------------------------------------------------------------intread(int sockFD, void *buffer, UInt32 numBytes);從指定插口中等待數(shù)據(jù)接收并存放到buffer中。該函數(shù)會掛起線程,直到有數(shù)據(jù)接收到。參數(shù):sockFd插口ID;buffer緩存地址;numBytes緩沖大小該函數(shù)返回接收到的數(shù)據(jù)大小,-1表示出錯(cuò),0表示遠(yuǎn)端已經(jīng)關(guān)閉連接。-------------------------------------------------------------------------------------int write(int sockFD, void *buffer, UInt32 numBytes);將緩存中數(shù)據(jù)寫到指定插口準(zhǔn)備發(fā)送。參數(shù):sockFd插口ID;buffer緩存地址;numBytes緩存中數(shù)據(jù)大小該函數(shù)返回實(shí)際發(fā)送的數(shù)據(jù)量,-1表示出錯(cuò)。-------------------------------------------------------------------------------------補(bǔ)充:lwIP協(xié)議棧在socket模式下也就是操作系統(tǒng)中運(yùn)行,創(chuàng)建進(jìn)程的方式與操作系統(tǒng)中創(chuàng)建進(jìn)程的方式有所不同。要用專用函數(shù):sys_thread_t sys_thread_new(char *name, void(* thread)(void *arg), void *arg, int stacksize, int prio)參數(shù):name線程說明;thread線程函數(shù);arg線程函數(shù)的參數(shù);stacksize線程堆棧大小;prio線程優(yōu)先級在lwIP下創(chuàng)建線程統(tǒng)一使用此函數(shù),當(dāng)然這個(gè)函數(shù)也是要調(diào)用系統(tǒng)創(chuàng)建線程的API的。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。