創(chuàng)建socket->命名socket->創(chuàng)建監(jiān)聽(tīng)
4.接受連接
4.1代碼:int accept(int sockfd,struct sockaddr addr,socklen_t addrlen);
4.2參數(shù)注釋
4.2.1 sockfd:執(zhí)行過(guò)李stem系統(tǒng)調(diào)用的監(jiān)聽(tīng)socket
4.2.2 addr:用來(lái)獲取被接受連接的遠(yuǎn)程socket地址,長(zhǎng)度下一個(gè)參數(shù)addlen
指定。
4.3返回
成功返回新的socket連接,該socket是唯一標(biāo)識(shí)
失敗返回-1并且設(shè)置errno
上篇說(shuō)過(guò)的客戶(hù)端斷網(wǎng)的情況,如今補(bǔ)充代碼
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比順德網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式順德網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋順德地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴(lài)。
int main(int argc,char *argv[]){
if(argc<=2){
printf("參數(shù)缺少 %s",basename(argv[0]));
return 1;
}
const char *ip=argv[1];
int port = atoi(argv[2]);//atoi (表示 ascii to integer)是把字符串轉(zhuǎn)換成整型數(shù)的一個(gè)函數(shù),應(yīng)用在計(jì)算機(jī)程序和辦公軟件中。int atoi(const char *nptr) 函數(shù)會(huì)掃描參數(shù) nptr字符串,跳過(guò)前面的空白字符(例如空格,tab縮進(jìn))等,可以通過(guò)isspace( )函數(shù)來(lái)檢測(cè)),直到遇上數(shù)字或正負(fù)符號(hào)才開(kāi)始做轉(zhuǎn)換,而在遇到非數(shù)字或字符串結(jié)束時(shí)('\0')才結(jié)束轉(zhuǎn)換,并將結(jié)果返回。如果 nptr不能轉(zhuǎn)換成 int 或者 nptr為空字符串,那么將返回 0[1]
struct sockaddr_in address;
bzero(&address,sizeof(address));//bzero:置字節(jié)字符串s的前n個(gè)字節(jié)為零且包括‘\0’。
adress.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);//inet_ptoi:inet_pton是一個(gè)IP地址轉(zhuǎn)換函數(shù),可以在將IP地址在“點(diǎn)分十進(jìn)制”和“二進(jìn)制整數(shù)”之間轉(zhuǎn)換而且,inet_pton和inet_ntop這2個(gè)函數(shù)能夠處理ipv4和ipv6。
adress.sin_port = htons(port);//htons:將整型變量從主機(jī)字節(jié)順序轉(zhuǎn)變成網(wǎng)絡(luò)字節(jié)順序
int sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);//使用斷言可以創(chuàng)建更穩(wěn)定,品質(zhì)更好且不易于出錯(cuò)的代碼。當(dāng)需要在一個(gè)值為FALSE時(shí)中斷當(dāng)前操作的話(huà),可以使用斷言。單元測(cè)試必須使用斷言(Junit/JunitX)。
int ret = bind(sock,{struct sockaddr*} &address,sizeof(address));
assert(ret!=1);
ret = listen(sock,5);
assert(ret!=1);
sleep(20);//等待20秒,用來(lái)等待客戶(hù)端連接和相關(guān)操作完成
struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
int connfd = accept(sock,{struct sockaddr*} &client,&client_addrlength);
if(connfd <0){
printf("errno:%d",errno);
}else{
char remote[INET_ADDRSTRLEN];
//ip:inet_ntop(AF_INET,&client.sin_addr,remote,INET_ADDRSTRLEN)
//端口:ntohs(client.sin_port)
close(connfd);
}
close(sock);
return 0;
}
./testaccept 192.168.1.109 54321
telnet 192.168.1.109 54321
netstat -nt | grep 54321
客戶(hù)端主動(dòng)鏈接
5.1 int connect (int sockfd,const struct sockaddr * serv_addr,socklen_t addrlen);
成功返回0
常見(jiàn)錯(cuò)誤:ECONNREFUSED:目標(biāo)端口不存在
···············ETIMEDOUT連接超時(shí)
int close(int fd);
不是真正的關(guān)閉,只是引用減1
真正關(guān)閉:int shutdown(int sockfd,int howto);