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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值