創建socket->命名socket->創建監聽
4.接受連接
4.1代碼:int accept (int sockfd,struct sockaddr addr,socklen_t addrlen);
4.2參數注釋
4.2.1 sockfd:執行過李stem系統調用的監聽socket
4.2.2 addr:用來獲取被接受連接的遠程socket地址,長度下一個參數addlen
指定。
4.3返回
成功返回新的socket連接,該socket是唯一標識
失敗返回-1并且設置errno
上篇說過的客戶端斷網的情況,如今補充代碼
int main(int argc,char *argv[]){
if(argc<=2){
printf("參數缺少 %s",basename(argv[0]));
return 1;
}
const char *ip=argv[1];
int port = atoi(argv[2]);//atoi (表示 ascii to integer)是把字符串轉換成整型數的一個函數,應用在計算機程序和辦公軟件中。int atoi(const char *nptr) 函數會掃描參數 nptr字符串,跳過前面的空白字符(例如空格,tab縮進)等,可以通過isspace( )函數來檢測),直到遇上數字或正負符號才開始做轉換,而在遇到非數字或字符串結束時('\0')才結束轉換,并將結果返回。如果 nptr不能轉換成 int 或者 nptr為空字符串,那么將返回 0[1]
struct sockaddr_in address;
bzero(&address,sizeof(address));//bzero:置字節字符串s的前n個字節為零且包括‘\0’。
adress.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);//inet_ptoi:inet_pton是一個IP地址轉換函數,可以在將IP地址在“點分十進制”和“二進制整數”之間轉換而且,inet_pton和inet_ntop這2個函數能夠處理ipv4和ipv6。
adress.sin_port = htons(port);//htons:將整型變量從主機字節順序轉變成網絡字節順序
int sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);//使用斷言可以創建更穩定,品質更好且不易于出錯的代碼。當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言。單元測試必須使用斷言(Junit/JunitX)。
int ret = bind(sock,{struct sockaddr*} &address,sizeof(address));
assert(ret!=1);
ret = listen(sock,5);
assert(ret!=1);
sleep(20);//等待20秒,用來等待客戶端連接和相關操作完成
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:目標端口不存在
···············ETIMEDOUT連接超時
int close(int fd);
不是真正的關閉,只是引用減1
真正關閉:int shutdown(int sockfd,int howto);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。