tcp/ip模型及函数


    
1.套接字创建函数:
int socket(int domain, int type, int protocol)
参数domain:表示要创建套接字的协议族,主要取值:
         AF_UNIX:创建一个只在本机内进行通信的套接字;
         AF_INET:使用Ipv4 TCP/IP协议;
         AF_INET6:使用Ipv6 TCP/IP协议
参数type:表示要创建套接字类型,取值有:
         SOCK_STREAM:创建一个TCP套接字;
         SOCK_DGRAM:创建一个UDP套接字;
         SOCK_RAM:创建一个原始套接字
参数protocol:表示通过参数domain和type指定的套接字类型确定使用的协议;当创建原
始套接字时,系统无法唯一确定协议,此时就需要使用该参数指定所使用的协议。
函数返回值:执行成功返回新创建的套接字,失败返回-1,错误代码存入error。

2.绑定端口函数
      int bind(int fd, _CONST_SOCKADDR_ARG addr, socklen_t len)
功能:将一个端口绑定到某个套接字上,该函数常用在服务器端;
参数fd:表示要绑定的(服务器端的)套接字描述符;
参数addr:表示要绑定的(服务器端)IP地址;
参数len:表示要绑定的IP长度
3.监听函数
     int listen(int fd, int n);
功能:将一个套接字转化为监听套接字,常用在服务器端监听来自客户端的连接请求;
参数fd:表示监听套接字描述符;
参数n:表示最大监听个数

4.建立连接函数
      int connect(int fd, _CONST_SOCKADDR_ARG addr, socklen_t len)
功能:在指定的套接字上创建一个连接;
参数fd:要连接的服务期端的套接字,若该套接字为SOCK_STREAM,则connect向服务器
发起连接请求;
参数addr:要连接的服务器端的IP和端口号;
参数len:表示地址addr长度
**若是TCP连接,只能调用一次connect函数建立连接;若是UDP,则可以多次调用该函数来改变发送数据的目的地址

5.接受连接函数
      int accept(int fd, _SOCKADDR_ARG addr, socklen_t *addr_len)
功能:接受来自监听套接字的请求;
参数fd:表示一个监听套接字;
参数addr:表示用来保存发起连接的主机的端口号和IP;
参数addr_len:表示addr长度;
返回值:返回一个和服务器建立连接的客户端的套接字

6.TCP的发送数据函数
       ssize_t send(int fd, const void *buf, size_t n, int flags)
参数fd:表示建立起连接的套接字(客户端套接字);
参数buf:要发送数据的缓冲区地址;
参数n:发送数据的长度;
参数flags:表示控制选项,一般取0

8.只接受TCP数据函数
      ssize_t recv(int fd, void *buf, size_t n, int flags)
参数fd:表示连接套接字(服务器端);
参数buf:表示接受缓冲区;
参数n:表示接受缓冲区大小;
参数flags:一般为0;

9.UDP发送数据函数
      int sendto(int fd, const void *buf, size_t n, int flags, _CONST_SOCKADDR_ARG addr, socklen_t addr_len)
参数fd:表示建立起连接的套接字(客户端套接字);
参数buf:要发送数据的缓冲区地址;
参数n:发送数据的长度;
参数flags:表示控制选项,一般取0
参数addr:若该参数非空,则表示不是面向连接的;
参数addr_len:表示addr长度

10.接受数据函数
ssize_t recvfrom(int fd, void *buf, size_t n, int flags, _SOCKADDR_ARG addr, socklen_t *addr_len)
功能:接受TCP或UDP数据;
参数fd:表示连接套接字(服务器端);
参数buf:表示接受缓冲区;
参数n:表示接受缓冲区大小;
参数flags:一般为0;
参数addr:若该参数非空,则表示不是面向连接的;
参数addr_len:表示addr长度

sockaddr、sockaddr_in和in_addr三者的区别:
1)    struct sockaddr
{
unsigned short sa_family;
char sa_data[14];
}
2)    struct sockaddr_in
{
short int sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}
3)    struct in_addr
{
union{
    struct (u_char s_b1, s_b2, s_b3, s_b4;)S_un_b;
    struct {u_short s_w1, s_w2; }S_un_w;
    u_long S_addr;
}S_un;

#define s_addr S_un.S_addr
};
或者
struct in_addr
{
    in_addr_t s_addr;
}
*sockaddr和sockaddr_in都是16Bytes;
 in_addr是4Bytes


 

猜你喜欢

转载自blog.csdn.net/daha1314/article/details/84589184