浅谈socket网络编程函数参数(二)
bind()函數(shù)
bind()函數(shù)把一個(gè)地址族中的特定地址賦給socket。
例如對(duì)應(yīng)AF_INET、AF_INET6就是把一個(gè)ipv4或ipv6地址和端口號(hào)組合賦給socket。
參數(shù)解析
- sockfd:即socket描述字,它是通過(guò)socket()函數(shù)創(chuàng)建了,唯一標(biāo)識(shí)一個(gè)socket。bind()函數(shù)就是將給這個(gè)描述字綁定一個(gè)名字。
- addr:一個(gè)const struct sockaddr *指針,指向要綁定給sockfd的協(xié)議地址。這個(gè)地址結(jié)構(gòu)根據(jù)地址創(chuàng)建socket時(shí)的地址協(xié)議族的不同而不同,
ipv4對(duì)應(yīng)的是:
解析:https://blog.csdn.net/csdn_kou/article/details/81452166
addrlen:對(duì)應(yīng)的是地址的長(zhǎng)度。
listen()
如果作為一個(gè)服務(wù)器,在調(diào)用socket()、bind()之后就會(huì)調(diào)用listen()來(lái)監(jiān)聽(tīng)這個(gè)socket,如果客戶端這時(shí)調(diào)用connect()發(fā)出連接請(qǐng)求,服務(wù)器端就會(huì)接收到這個(gè)請(qǐng)求。
int listen(int sockfd, int backlog);- listen函數(shù)的第一個(gè)參數(shù)即為要監(jiān)聽(tīng)的socket描述字,第二個(gè)參數(shù)為相應(yīng)socket可以排隊(duì)的最大連接個(gè)數(shù)。
- socket()函數(shù)創(chuàng)建的socket默認(rèn)是一個(gè)主動(dòng)類(lèi)型的,listen函數(shù)將socket變?yōu)楸粍?dòng)類(lèi)型的,等待客戶的連接請(qǐng)求。
connect()函數(shù)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);- connect函數(shù)的第一個(gè)參數(shù)即為客戶端的socket描述字
- 第二參數(shù)為服務(wù)器的socket地址
- 第三個(gè)參數(shù)為socket地址的長(zhǎng)度。
- 客戶端通過(guò)調(diào)用connect函數(shù)來(lái)建立與TCP服務(wù)器的連接。
accept()函數(shù)
概念
TCP服務(wù)器端依次調(diào)用socket()、bind()、listen()之后,就會(huì)監(jiān)聽(tīng)指定的socket地址了。TCP客戶端依次調(diào)用socket()、connect()之后就向TCP服務(wù)器發(fā)送了一個(gè)連接請(qǐng)求。TCP服務(wù)器監(jiān)聽(tīng)到這個(gè)請(qǐng)求之后,就會(huì)調(diào)用accept()函數(shù)取接收請(qǐng)求,這樣連接就建立好了。之后就可以開(kāi)始網(wǎng)絡(luò)I/O操作了,即類(lèi)同于普通文件的讀寫(xiě)I/O操作。
關(guān)鍵點(diǎn)
*accept()會(huì)創(chuàng)建一個(gè)新的socket,并且正是這個(gè)新的socket會(huì)與執(zhí)行connect()的對(duì)象socket進(jìn)行連接。
返回值
accept()的返回結(jié)果是已經(jīng)連接的socket文件描述符
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回連接connect_fd
用法
int newfd = -1;struct sockaddr_in cli_addr;newfd = accept(lst_fd, (struct sockaddr*)&cli_addr, &len);if (newfd < 0) {perror("accept error");continue;} ---------------------------------------------------------------socklen_t len = sizeof(struct sockaddr_in);int lst_fd = -1;lst_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (lst_fd < 0) {perror("socket error");return -1;}- 參數(shù)sockfd就是上面解釋中的監(jiān)聽(tīng)套接字,這個(gè)套接字用來(lái)監(jiān)聽(tīng)一個(gè)端口,當(dāng)有一個(gè)客戶與服務(wù)器連接時(shí),它使用這個(gè)一個(gè)端口號(hào),而此時(shí)這個(gè)端口號(hào)正與這個(gè)套接字關(guān)聯(lián)。當(dāng)然客戶不知道套接字這些細(xì)節(jié),它只知道一個(gè)地址和一個(gè)端口號(hào)。
- 參數(shù)addr
這是一個(gè)結(jié)果參數(shù),它用來(lái)接受一個(gè)返回值,這返回值指定客戶端的地址,當(dāng)然這個(gè)地址是通過(guò)某個(gè)地址結(jié)構(gòu)來(lái)描述的,用戶應(yīng)該知道這一個(gè)什么樣的地址結(jié)構(gòu)。如果對(duì)客戶的地址不感興趣,那么可以把這個(gè)值設(shè)置為NULL。 - 參數(shù)len
如同大家所認(rèn)為的,它也是結(jié)果的參數(shù),用來(lái)接受上述addr的結(jié)構(gòu)的大小的,它指明addr結(jié)構(gòu)所占有的字節(jié)個(gè)數(shù)。同樣的,它也可以被設(shè)置為NULL。
close()函數(shù)
在服務(wù)器與客戶端建立連接之后,會(huì)進(jìn)行一些讀寫(xiě)操作,完成了讀寫(xiě)操作就要關(guān)閉相應(yīng)的socket描述字
#include <unistd.h> int close(int fd);總結(jié)
以上是生活随笔為你收集整理的浅谈socket网络编程函数参数(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使命召唤手游急冻寒流多少钱
- 下一篇: 运算符与,|与||的区别