Linux 网络编程——TCP&UDP

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_INETIPV4网络协议
AF_INET6IPV6网络协议

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值