創(chuàng)建socket->命名socket->創(chuàng)建監(jiān)聽
4.接受連接
4.1代碼:int accept(int sockfd,struct sockaddr addr,socklen_t addrlen);
4.2參數(shù)注釋
4.2.1 sockfd:執(zhí)行過李stem系統(tǒng)調(diào)用的監(jiān)聽socket
4.2.2 addr:用來獲取被接受連接的遠(yuǎn)程socket地址,長度下一個參數(shù)addlen
指定。
4.3返回
成功返回新的socket連接,該socket是唯一標(biāo)識
失敗返回-1并且設(shè)置errno
上篇說過的客戶端斷網(wǎng)的情況,如今補(bǔ)充代碼
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比順德網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式順德網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋順德地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
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ù)的一個函數(shù),應(yīng)用在計(jì)算機(jī)程序和辦公軟件中。int atoi(const char *nptr) 函數(shù)會掃描參數(shù) nptr字符串,跳過前面的空白字符(例如空格,tab縮進(jìn))等,可以通過isspace( )函數(shù)來檢測),直到遇上數(shù)字或正負(fù)符號才開始做轉(zhuǎn)換,而在遇到非數(shù)字或字符串結(jié)束時('\0')才結(jié)束轉(zhuǎn)換,并將結(jié)果返回。如果 nptr不能轉(zhuǎn)換成 int 或者 nptr為空字符串,那么將返回 0[1]
struct sockaddr_in address;
bzero(&address,sizeof(address));//bzero:置字節(jié)字符串s的前n個字節(jié)為零且包括‘\0’。
adress.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);//inet_ptoi:inet_pton是一個IP地址轉(zhuǎn)換函數(shù),可以在將IP地址在“點(diǎn)分十進(jìn)制”和“二進(jìn)制整數(shù)”之間轉(zhuǎn)換而且,inet_pton和inet_ntop這2個函數(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ì)更好且不易于出錯的代碼。當(dāng)需要在一個值為FALSE時中斷當(dāng)前操作的話,可以使用斷言。單元測試必須使用斷言(Junit/JunitX)。
int ret = bind(sock,{struct sockaddr*} &address,sizeof(address));
assert(ret!=1);
ret = listen(sock,5);
assert(ret!=1);
sleep(20);//等待20秒,用來等待客戶端連接和相關(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
客戶端主動鏈接
5.1 int connect (int sockfd,const struct sockaddr * serv_addr,socklen_t addrlen);
成功返回0
常見錯誤:ECONNREFUSED:目標(biāo)端口不存在
···············ETIMEDOUT連接超時
int close(int fd);
不是真正的關(guān)閉,只是引用減1
真正關(guān)閉:int shutdown(int sockfd,int howto);
網(wǎng)站欄目:socket相關(guān)操作(下)
網(wǎng)頁鏈接:http://chinadenli.net/article8/giocip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、域名注冊、外貿(mào)網(wǎng)站建設(shè)、微信小程序、網(wǎng)站收錄、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)