程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Beej’s Guide Network to Programming 系列連載09

Beej’s Guide Network to Programming 系列連載09

編輯:關於C語言

5.2. socket() ---獲得文件描述符
       我不想長篇大論---我要談的調用系統函數socket()。下面是他的原型:

#include<sys/types.h>

#include<sys/socket.h>

 

int socket(intdomain, int type, int protocol);

 

       但是這些參數干什麼的呢?他們允許你使用哪種套接字(IPv4還是IPv6;TCP還是UDP)。

       它曾經是人們將這些值進行硬編碼,你也可以這麼做。(domain可以選擇PF_INET或者PF_INET6;type可以選擇SOCK_STREAM或者SOCK_DGRAM;protocol設置為0,或者你可以調用getprotobyname()來查找你想要的協議,“tcp”或“UDP” 。)

       譯者注:SOCK_STREAM等同於TCP;SOCK_DGRAM等同於UDP。所以你不用費二遍事再作一次J

 

       (編者在這兒又敘述了一下PF_*與AF_*的一些關系)

       譯者注:他們其實是等同的,有興趣的讀者可以看《UnixNetwork Programming》第一卷中第四章第2節中的“AF_xxxVersus PF_xxx”

 

       你真正要做的是把調用getaddrinfo()得到的結果值,直接給socket()函數使用像下面這樣:

int s;

struct addrinfohints, *res;

 

// do the lookup

// [pretend wealready filled out the “hints” struct]

getaddrinfo(www.example.com, “http”, &hints,&res);

 

// [again, youshould do error-checking on getaddrinfo(), and walk

// the “res”linked list looking for valid entries instead of just

// assuming thefirst one is good (like many of these example do.)

// See the sectionon client/server for real examples.]

 

s =socket(res->ai_family, res->ai_socktype, res->ai_protocol);

 

       socket()函數只是簡單地返回給你一個套接字描述符,以供其後的其它系統函數使用;或者返回-1錯誤。全局變量errno是設置錯誤值的。(errno詳見man文檔)

       好,好,好!但是使用這樣的方式有什麼益處嗎?答案就是:簡潔!

 

摘自 xiaobin_HLJ80的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved