1. 程式人生 > >socket相關操作(下)

socket相關操作(下)

品質 應用 tac ·· 字符 返回 ddr [1] 中斷

創建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連接超時

6.關閉連接

int close(int fd);

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

真正關閉:int shutdown(int sockfd,int howto);

socket相關操作(下)