Linux 网络编程——TCP&UDP
TCP编程
TCP编程模型
UDP编程
UDP编程模型
相关函数
socket()
函数原型:
int socket(int domain, int type, int protocol);
头文件:
#include <sys/socket.h>
#include <sys/types>
函数说明: socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。
参数说明:
domain:指定使用何种地址类型
参数 | 备注 |
---|---|
AF_INET | IPV4网络协议 |
AF_INET6 | IPV6网络协议 |
type:
参数 | 备注 |
---|---|
SOCK_STREAM | 提供双向连续且可信赖的数据流,即TCP |
SOCK_DGRAM | 使用不连续不可信赖的数据包链接,即UDP |
protocol:用来指定socket所使用的传输协议编号,通常此参数不用管,设为0即可。
返回值:
成功:返回socket处理代码
失败:返回-1
bind()
函数原型:
int bind(int sockfd, struct sockaddr* myaddr, int addrlen)
头文件:
#include <sys/socket.h>
#include <sys/types>
**函数说明:**bind()用来设置给参数sockfd的socket一个名称。此名称由参数myaddr指向一个sockaddr的结构体,对于不同的socket domain定义了一个通用的数据结构
参数说明:
struct sockaddr{
unsigned short int sa_family;
char sa_data[14];
};
//sa_family为调用socket()时的domain参数,即AF_XXXX值
//sa_data最多使用14字符长度
此sockaddr结构会因使用不同的socket domain而有不同的结构定义,例如,使用AF_INET,其sockaddr结构定义便为:
struct socketaddr_in{
unsigned short int sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
struct in_addr{
uint32_t s_addr;
};
//sin_family即为sa_family
//sin_port为使用的port编号
//sin_addr.s_addr为IP地址
//sin_zero未使用
addrlen:sockaddr的结构体长度
返回值:
成功:返回0 失败:返回-1
listen()
函数原型:
int listen(int s, int backlog);
头文件:#include <sys/socket.h>
函数说明: listen()用来等待参数s的socket连线。参数backlog指定同时能处理的最大连接数,如果连接数达到此上线,则client端将收到ECONNREFUSED错误。
备注:
1. listen()并未开始接收连接,只是设置socket为listen模式,真正接收client端连线的是accept()。通常listen()会在socket(),bind()之后调用,之后才调用accept().
2. listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型
参数说明:
backlog:指定能处理的最大连接数。如果socket为AF_INET则参数backlog最大值可设为128.
返回值:
成功:返回0失败:返回-1
accept()
函数原型:
int accept(int s, struct sockaddr* addr, int* addrlen);
头文件:
#include <sys/socket.h>
#include <sys/types.h>
**函数说明:**accept()用来接收参数s的socket连线。
参数说明:
+ s:参数s的socket必须先经过bind()、listen()函数处理过,当有连接进来时,accept会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来的参数s的socket能继续使用accept()来接收新的连接。
+ addr:参数addr所指的结构体会被系统填入远程主机的地址数据。
+ addrlen:addrlen为sockaddr结构体的长度,sockaddr的定义请参考bind()函数。
返回值:
成功:返回新的socket处理代码
失败:返回-1
htons()
函数原型:
unsigned short int htons(unsigned short int hostshort);
头文件: #include <netinet/in.h>
函数说明: htons()用来将参数指定的16位hostshort转换成网络字符序
返回值: 返回对应的网络字符序
ntohs()
函数原型:
unsigned short int ntohs(unsigned short int netshort);
头文件: #include <netinet/in.h>
函数说明: htons()用来将参数指定的16位netshort转换成主机字符序
返回值: 返回对应的主机字符序
inet_pton()
函数原型:
int inet_pton(int af, const char *src, void *dst)
头文件: #include <arpa/inet.h>
函数说明: 将src参数指明的的点分十进制地址转变为网络字符序地址,并将其放置在dst参数中。其中af参数必须是AF_INET或AF_INET6
参数说明:
+ af:af参数即socket()函数的domain参数。详情见socket()函数。
+ src:src是已知的点分十进制IP地址
+ dst:用于存放网络字节序的IP地址
返回值:
成功:返回1
失败:如果src不是一个与af相关的点分十进制IP地址,则返回0;如果af参数错误,则返回-1,并且将errno设置为EAFNOSUPPORT
inet_ntop()
函数原型:
const char *inet_ntop(int af, const void* src, char *dst, socklen_t size)
头文件: #include <arpa/inet.h>
函数说明: 该函数将由af确定的IP地址族类型的src网络字符序IP地址转换为点分十进制IP地址,并存放在dst参数中。
参数说明:
+ af:af参数即socket()函数的domain参数。详情见socket()函数。
+ src:src是已知的网络字符序IP地址
+ dst:用于存放已转换的本地字符序的IP地址
+ size:dst的长度
返回值:
成功:返回一个指向dst的非空指针
失败:返回NULL
recv(),recvfrom(),recvmsg()
函数原型:
1. ssize_t recv(int sockfd, void *buf, size_t len, int flags);
2. ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
3. ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数说明: 这3个函数均为socket的接收函数,用于将接收的信息缓存在buf或msg中。参数flags一般设置为0.
参数说明:
+ socket:主机指定的socket
+ buf:用于缓存接收到的数据
+ len:可接收数据的最大长度
+ flags:一般设置为0
+ src_addr:用于缓存接收到的socket address信息
+ addrlen:src_addr的长度
+ msg:
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
size_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */};
返回值:
成功:返回接收到的字节数
失败:当发生错误时返回-1,当客户端已经关闭时返回0
send(), sendto(), sendmsg()
函数原型:
1. ssize_t send(int sockfd, const void *buf, size_t len, int flags);
2.ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
3. ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数说明: 这3个函数均为socket的发送函数,用于将发送的信息缓存在buf或msg中。参数flags一般设置为0.
参数说明:
+ socket:主机指定的socket
+ buf:用于缓存要发送的数据
+ len:数据长度
+ flags:一般设置为0
+ dest_addr:欲传送的网络地址
+ addrlen:dest_addr的长度
返回值:
成功:返回发送的字节数
失败:返回-1