套接字編程,創建套接字socket


1、套接字地址結構:

struct sockaddr {
  sa_family_t sa_family;
  char sa_data[14];
};

其中,成員sa_family表示套接字的協議族類型,對應於TCP/IP協議該值為AF_INET;成員sa_data存儲具體的協議地址。

sa_data之所以被定義成14個字節,因為有的協議族使用較長的地址格式。一般在編程中並不對該結構體進行操作,

而是使用另一個與它等價的數據結構:sockaddr_in

每種協議族都有自己的協議地址格式,TPC/IP協議族的地址格式為結構體struct sockaddr_in

他在netinet/in.h頭文件中定義。

struct sockaddr_in
{
  unsigned short   sin_family;

  unsigned short   sin_port;
  struct in_addr    sin_addr; /* Internet address. */

  unsigned char    sin_zero[8];

};

其中成員sin_family表示地址類型,對於使用TCP/IP協議進行的網絡編程,該值只能是AF_INET。

sin_port是端口號,

sin_addr用來存儲32位的ip地址。

數組sin_zero為填充字段,一般賦值為0

結構體struct in_addr的定義如下:

struct in_addr{

  unsigned long  s_addr;

};

結構體sockaddr 的長度為16個字節,結構體sockaddr_in的長度也為16個字節。通常在編寫基於TCP/IP協議

的網絡程序時,使用結構體sockaddr_in來設置地址,然后通過強制類型轉換成sockaddr 類型。

以下是設置地址信息的示例代碼:

struct sockaddr_in sock;

sock.sin_family = AF_INET ;

sock.sin_port = htons(6000);

sock.sin_addr.s_addr = inet_addr("200.200.3.18");

memset(sock.sin_zero, 0, sizeof(sock.sin_zero));

 

2、創建套接字

socket函數用來創建一個套接字。

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

參數domain用於指定創建套接字所使用的協議族,

常用的協議族:

AF_UNIX, AF_LOCAL 創建只在本機內進行通信的套接字
AF_INET     使用 IPv4   TCP/IP 協議
AF_INET6      使用 IPv6    TCP/IP 協議

參數type指定套接字的類型,可取如下值:

SOCK_STREAM 創建TCP流套接字

SOCK_DGRAM 創建UDP數據報套接字

SOCK_RAW 創建原始套接字

參數protocol通常設置為0,表示通過參數domain指定的協議族和參數type指定的套接字類型來確定使用的協議。當創建原始

套接字時,系統無法唯一地確定協議,此時就需要使用該參數指定所使用的協議。

---------------------------------------

創建TCP套接字:

int sock_fd;

sock_fd = socket(AF_INET, SOCK_STREAM, 0);

if  (sock_fd  <  0)

{

  perror("socket error:");

  exit(1);

}

 

創建UDP套接字:

int sock_fd;

sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM