socket相關操做(下)

建立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.發起鏈接

客戶端主動連接
5.1 int  connect (int sockfd,const struct sockaddr * serv_addr,socklen_t addrlen);

成功返回0
常見錯誤:ECONNREFUSED:目標端口不存在
···············ETIMEDOUT鏈接超時socket

6.關閉鏈接

int close(int fd);ide

不是真正的關閉,只是引用減1函數

真正關閉:int shutdown(int sockfd,int howto);單元測試

相關文章
相關標籤/搜索