网络编程相关API
网络编程常用函数
socket() 创建套接字
bind() 绑定本机地址和端口
connect() 建立连接
listen() 设置监听端口
accept() 接受TCP连接
recv(), read(), recvfrom() 数据接收
send(), write(), sendto() 数据发送
close(), shutdown() 关闭套接字
1、编程步骤
2、socket函数
int socket (int domain, int type, int protocol);
domain
是地址族
AF_INET
// internet 协议AF_UNIX
// unix internal协议AF_NS
// Xerox NS协议AF_IMPLINK
// Interface Message协议
type
// 套接字类型SOCK_STREAM
// 流式套接字-TCP
SOCK_DGRAM
// 数据报套接字-UDP
SOCK_RAW
// 原始套接字-直接传输
protocol
参数通常置为0
3、bind函数
int bind (int sockfd, struct sockaddr\* addr, int addrLen);
sockfd
由socket()
调用返回addr
是指向sockaddr 结构
的指针
,包含本机IP 地址
和端口号
通用地址结构
struct sockaddr
{
u_short sa_family; // 地址族, AF\_xxx
char sa_data[14]; // 14字节协议地址
};
我们使用的是:Internet协议地址结构
struct sockaddr\_in
{
u_short sin_family; // 地址族, AF\_INET,2 bytes
u_short sin_port; // 端口,2 bytes
struct in\_addr sin_addr; // IPV4地址,4 bytes
char sin_zero[8]; // 8 bytes unused,作为填充
};
// internet address
struct in\_addr
{
in\_addr\_t s_addr; // u32 network address
};
addrLen
: 结构体大小sizeof (struct sockaddr_in)
一般用法:
(1)定义一个struct sockaddr_in类型的变量并清空
struct sockaddr_in myaddr;
memset(&myaddr, 0, sizeof(myaddr));
(2)填充地址信息
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(8888);
myaddr.sin_addr.s_addr = inet_addr(“192.168.1.100”);
(3)将该变量强制转换为struct sockaddr类型在函数中使用
bind(listenfd, (struct sockaddr*)(&myaddr), sizeof(myaddr));
4、地址转换函数
(1)主机转网络字序
unsigned long inet\_addr(char \*address);
address
是以’\0’
结尾的点分IPv4字符串
。该函数返回32位
的地址数据。
如果字符串包含的不是合法的IP地址,则函数返回-1
。
例如:
struct in\_addr addr;
addr.s_addr = inet\_addr(" 192.168.1.100 ");
(2)网络转主机字序