1. 程式人生 > >linux高性能網絡編程讀書筆記之socket數據讀寫

linux高性能網絡編程讀書筆記之socket數據讀寫

實例 返回 內核空間 main 調用 printf accept 連接失敗 accep

數據讀寫分為TCP數據讀寫,UDP數據讀寫,通用數據讀寫
1.TCP數據讀寫
定義:socket是連接用戶空間和內核空間,TCP和UDP是內核第一層。
解釋:對於文件的read和write同樣適用於socket
例子:對於TCP流數據的系統調用
1.1ssize_t recv(int sockfd,void buf,size_t len,int flags);
1.2ssize_t send(int sockfd,const void
buf,size_t len,int flags);

參數解釋:
1.3buf和len是指緩存區的位置和大小
1.3.1flags通常為0
recv成功返回實際讀取到的數據的長度

註:實際讀取的長度可能小於期望len,所以要多次調用recv
recv可能返回0,意味著通信對方已經關閉了連接
recv出錯返回-1並設置errno

1.4send基本上同上
發送的實例代碼

        int  main(int argc, char *argv[]){
                if(argc<=2){
                        printf("參數是錯誤");
                }

            //一系列之前的連接
            if(connect(sockfd,(struct sockaddr*) &server_address,sizeof(server_address))<0){
                    printf("連接失敗");
            }else{
                    const  char* oob_data = "abc";

                    const  char* normal_data = "123";

                    send(sockfd,normal_data,strlen(normal_data),0);

                    sned(sockefd,oob_data,strlen(oob_data).MSG_OOB);
                    send(sockfd,normal_data,strlen(normal_data),0);

            }
            close(sockfd);
            return 0;

        }

        //接收代碼也是類似的
        //連接成功
        int  connfd = accept(sock,(struct  sockaddr *) &client,&client_addrlength);
        char  buffer[BUF_SIZE];

        memset(buffer,‘\0‘,BUF_SIZE);

        ret = recv(connfd,buffer,BUF_SIZE-1,0);

        close(connfd);
        close(sock);
        return 0;

        ./testoobrecv  192.168.1.109  54321

        ./testoobsend  192.168.1.109  54321  

        tcpdump  -ntx -i eth0  port 54321

        註:flags參數只對send和recv的當前調用生效,可以使用setsockket系統調用來永久性修改socket的某些屬性

linux高性能網絡編程讀書筆記之socket數據讀寫