Socket API詳解(1)

#include <sys/socket.h>

int socket (int namespace, int style, int protocol)
int bind (int socket, struct sockaddr *addr, socklen_t length)
int listen (int socket, int n)
int accept (int socket, struct sockaddr *addr, socklen_t *length_ptr)

1、初始化socket

int socket (int namespace, int style, int protocol)

(1)namespace
表示地址族(AF)或者協議族(PF),常用值AF_INET ,表示TCP/IP協議族。

/* Supported address families. */
/*
 * Address families.
 */
#define AF_UNSPEC       0               /* unspecified */
/* FIXME: This is for testing only, while developing the new
          fhandler_socket_unix class. */
#if defined (__INSIDE_CYGWIN__) && defined (__WITH_AF_UNIX)
#define AF_UNIX         31
#else
#define AF_UNIX         1               /* local to host (pipes, portals) */
#endif
#define AF_LOCAL        1               /* POSIX name for AF_UNIX */
#define AF_INET         2               /* internetwork: UDP, TCP, etc. */
#define AF_IMPLINK      3               /* arpanet imp addresses */
#define AF_PUP          4               /* pup protocols: e.g. BSP */
#define AF_CHAOS        5               /* mit CHAOS protocols */
#define AF_NS           6               /* XEROX NS protocols */
#define AF_ISO          7               /* ISO protocols */
#define AF_OSI          AF_ISO          /* OSI is ISO */
#define AF_ECMA         8               /* european computer manufacturers */
#define AF_DATAKIT      9               /* datakit protocols */
#define AF_CCITT        10              /* CCITT protocols, X.25 etc */
#define AF_SNA          11              /* IBM SNA */
#define AF_DECnet       12              /* DECnet */
#define AF_DLI          13              /* Direct data link interface */
#define AF_LAT          14              /* LAT */
#define AF_HYLINK       15              /* NSC Hyperchannel */
#define AF_APPLETALK    16              /* AppleTalk */
#define AF_NETBIOS      17              /* NetBios-style addresses */
#define AF_INET6        23              /* IP version 6 */

#define AF_MAX          32
/*
 * Protocol families, same as address families for now.
 */
#define PF_UNSPEC       AF_UNSPEC
#define PF_UNIX         AF_UNIX
#define PF_LOCAL        AF_LOCAL
#define PF_INET         AF_INET
#define PF_IMPLINK      AF_IMPLINK
#define PF_PUP          AF_PUP
#define PF_CHAOS        AF_CHAOS
#define PF_NS           AF_NS
#define PF_ISO          AF_ISO
#define PF_OSI          AF_OSI
#define PF_ECMA         AF_ECMA
#define PF_DATAKIT      AF_DATAKIT
#define PF_CCITT        AF_CCITT
#define PF_SNA          AF_SNA
#define PF_DECnet       AF_DECnet
#define PF_DLI          AF_DLI
#define PF_LAT          AF_LAT
#define PF_HYLINK       AF_HYLINK
#define PF_APPLETALK    AF_APPLETALK
#define PF_NETBIOS      AF_NETBIOS
#define PF_INET6        AF_INET6

#define PF_MAX          AF_MAX

(2)style
表示socket類型,常用值SOCK_STREAM(流式套接字)、SOCK_DGRAM(數據報套接字)。

/* Socket types. */
#define SOCK_STREAM	1		/* stream (connection) socket	*/
#define SOCK_DGRAM	2		/* datagram (conn.less) socket	*/
#define SOCK_RAW	3		/* raw socket			*/
#define SOCK_RDM	4		/* reliably-delivered message	*/
#define SOCK_SEQPACKET	5		/* sequential packet socket	*/

(3)protocol
指定某個協議的特定類型,即type中的某個特定類型;
通常某個協議只有一種特定類型,因此protocol僅能設置爲0;
若某個協議(SOCK_RAW)有多個特定類型,則需要這個參數來選擇某個特定類型。

(4)返回值
函數調用成功,返回一個套接字文件描述符(socket file descriptor);
調用失敗,返回錯誤碼:

#include <sys/errno.h>
#define	EACCES 13	/* Permission denied */
#define	ENFILE 23	/* Too many open files in system */
#define	EMFILE 24	/* File descriptor value too large */
#define ENOBUFS 105	/* No buffer space available */
#define EPROTONOSUPPORT 123	/* Unknown protocol */

/*
EPROTONOSUPPORT 	 The protocol or style is not supported by the namespace specified. 


	- EMFILE The process already has too many file descriptors open. 


	- ENFILE The system already has too many file descriptors open. 


	- EACCES The process does not have the privilege to create a socket of the specified style 
	 or protocol. 


	- ENOBUFS The system ran out of internal buffer space. 
*/

2、socket綁定IP地址和端口

int bind (int socket, struct sockaddr *addr, socklen_t length)

(1)socket
socket()函數的返回值,即創建的一個新的套接字文件描述符。
(2)addr
結構體 sockaddr 設置需要綁定的端口和IP地址。

struct sockaddr_in
{
  sa_family_t	 sin_family;	/* Address family		*/
  in_port_t	 	 sin_port;		/* Port number			*/
  struct in_addr sin_addr;		/* Internet address		*/

  /* Pad to size of `struct sockaddr'. */
  unsigned char  __pad[__SOCK_SIZE__ - sizeof(short int)
			- sizeof(unsigned short int) - sizeof(struct in_addr)];
};
struct sockaddr {
  sa_family_t		sa_family;	/* address family, AF_xxx	*/
  char			sa_data[14];	/* 14 bytes of protocol address	*/
};

(3)length
結構體 sockaddr 的長度

(4)返回值

0:綁定成功
-1:綁定失敗
其他值:錯誤碼

錯誤碼:

#define	EBADF 9		/* Bad file number */
#define	EACCES 13	/* Permission denied */
#define	EINVAL 22	/* Invalid argument */
#define ENOTSOCK 108	/* Socket operation on non-socket */
#define EADDRINUSE 112		/* Address already in use */
#define EADDRNOTAVAIL 125	/* Address not available */
/*
EBADF 	 The socket argument is not a valid file descriptor. 


	- ENOTSOCK The descriptor socket is not a socket. 


	- EADDRNOTAVAIL The specified address is not available on this machine. 


	- EADDRINUSE Some other socket is already using the specified address. 


	- EINVAL The socket socket already has an address. 


	- EACCES You do not have permission to access the requested address. (In the Internet 
	 domain, only the super-user is allowed to specify a port number in the range 0 through 
	 IPPORT_RESERVED minus one; see Ports.) 
*/

代碼示例:

struct sockaddr_in server_addr; /* 服務器結構地址 */

/* 設置服務器地址 */
bzero(&server_addr, sizeof(server_addr));		/* 清零 */
server_addr.sin_family = AF_INET;				/* 協議族 */
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);/* 本地地址 */
server_addr.sin_port = htons(PORT);				/* 服務器端口 */

bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));

bzero函數:

Name: bzero
Prototype: void bzero (void *block, size_t size)
Description:
This is a partially obsolete alternative for memset, derived from BSD. Note that it is not as general as 
 memset, because the only value it can store is zero. 
Header files:
string.h
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章