#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