美文网首页
基本TCP套接字编程API

基本TCP套接字编程API

作者: m风满楼 | 来源:发表于2018-09-22 22:38 被阅读0次
套接字地址结构:
#include<netinet/in.h>
struct in_addr{           #存放ip地址
    in_addr_t       s_addr;     /*32-bit IPv4 address*/
};                          /*network byte ordered*/
struct sockaddr_in{  #存放sock地址所有信息,包含ip
    unit8_t     sin_len;        /*length of structure(16)*/
    sa_family_t sin_family; /*AF_INET*/
    in_port_t       sin_port;       /*16-bit TCP or UDP port number*/
                            /*network byte ordered*/
    struct in_addr  sin_addr;       /*32-bit IPv4 address, network byte ordered*/
    char            sin_zero[8];    
  • 通用套接字地址结构是为了解决不同协议族之间套接字地址结构不同的问题
struct sockaddr{
    unit8_t sa_len;     /*address family:AF_xxx value*/
    sa_family_t sa_family;  /*protocol-specific address*/
    char             sa_data[14] ; 
  • 套接字函数都被定义为以指向某个通用套接字地址结构的一个指针作为其参数之一,所以函数的任何调用都要进行强制类型转换,举例如下
struct sockaddr_in server ;
int bind(int, (struct sockaddr *) &server, sizeof(server));
API:
#include <sys/socket.h>
int socket(int family, int type, int protocol);  
    family:
        AF_INET, AF_INET6, AF_LOCAL(AF_UNIX), AF_ROUTE, AF_KEY
    type:
        SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW
    protocol:
        IPPROTO_TCP, IPPROTO_UDP, IPPROTO_SCTP, 0(default)
    error return -1
 
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr * servaddr, socklen_t addrlen);
    success return 0, error return -1
 
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr * myaddr, socklen_t addrlen);
    success return 0, error return -1
    server:
        IPV4:
            struct sockaddr_in servaddr;
            servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        IPV6:
            struct sockaddr_in6 servaddr;
            servaddr.sin6_addr = in6addr_any;
 
#include <sys/socket.h>
int listen(int sockfd, int backlog);
    success return 0, error return -1
    convert active-socket to passive-socket
 
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr * cliaddr, socklen_t * addrlen);
    error return -1
    sockfd should be a passive-socket(listened-socket)
 
#include <unistd.h>
pid_t fork(void);
    error return -1
 
#include <unistd.h>
int execl(const char * pathname, const char * arg0, ... /* (char *)0 */);
int execv(const char * pathname, char * const argv[]);
int execle(const char * pathname, const char * arg0, ... 
           /* (char *)0, char * const envp[] */);
int execve(const char * pathname, char * const argv[], char * const envp[]);
int execlp(const char * filename, const char * arg0, ... /* (char *)0 */);
int execvp(const char * filename, char * const argv[]);
    success no return, error return -1
 
#include <unistd.h>
int close(int sockfd);
    success return 0, error return -1
 
#include <sys/socket.h>
 #取得本地套接字地址
int getsockname(int sockfd, struct sockaddr * localaddr, socklen_t * addrlen);
#取得对方套接字地址
int getpeername(int sockfd, struct sockaddr * peeraddr, socklen_t * addrlen); 
    success return 0, error return -1
  • 经过TCP封装后的数据称为TCP segment,TCP为通信双方维持一个链接,且在内核存储相关数据,这部分数据包括TCP头部信息和TCP内核缓冲区。当应用层调用write进行写数据的时候,数据首先会从用户空间拷贝到与该TCP链接所对应的内核缓冲区中,然后TCP模块调用IP模块进行数据的发送。
  • 当应用进程多次执行写操作的时候,TCP把这些数据缓存到本地的TCP缓冲区中,当TCP真正开始发送数据的时候,发送缓冲区中的这些等待发送的数据可能被封装成一个或多个TCPsegment,所以应用进程的写次数和TCP发送的次数没有数量关系。
  • 当接受段接收到一个或多个TCP segment后,TCP把他们携带的数据按照TCPsegment的格式进行解析后发到TCP接受缓冲区中,并通知应用进程读数据(怎么通知?)。接受端可以一次性全部读完,也可以读多次,这取决于应用进程缓冲区的大小。

获取套接字的地址信息

#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
//返回:若字符串有效则为1,否则为0
in_addr_t inet_addr(const char *strptr); #该函数已经弃用,尽量另外两个
//返回:若字符串有效则为32位二进制网络字节序的IPV4地址,否则为INADDR_None
char *inet_ntoa(struct in_addr inaddr);
//返回:指向一个点分十进制数串的指针

相关文章

  • 基本TCP套接字编程API

    套接字地址结构: 通用套接字地址结构是为了解决不同协议族之间套接字地址结构不同的问题 套接字函数都被定义为以指向某...

  • socket 和 网络I/O模型

    《UNIX 网络编程卷一:套接字联网API》笔记 套接字 套接字编程接口,是在 TCP/IP 协议族中,应用层进入...

  • socket网络编程之二(回显程序实例)

    在我的上一篇文章socket网络编程之一(TCP套接字API)中,介绍了ipv4的套接字数据结构和tcp套接字相关...

  • 基本TCP套接字编程

    什么是套接字?这里copy一下wiki上面的定义:一个应用程序接口(API),使用一个Internet套接字的概念...

  • TCP套接字编程

    TCP交互流程 https://blog.csdn.net/yansmile1/article/details/5...

  • tcp和udp

    【Python网络编程】利用Python进行TCP、UDP套接字编程 http://www.cnblogs.com...

  • 网络编程之套接字

    套接字 套接字编程 根据socket模块提供的接口函数,进行组合使 用完成基于tcp或者udp的网路...

  • TCP基本套接字编程笔记(一)套接字函数

    使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务端(Server)和客户端(Clien...

  • Android网络编程-Socket

    Socket在Android网络编程中,有着非常重要的作用。 Socket基本概念 即套接字,是应用层 与 TCP...

  • 20年书单45《TCP/IP网络编程》

    45.《TCP/IP网络编程》|[韩]尹圣雨 推荐星级:★★★★ TCP?IP?UDP?套接字?域名?多进程?进程...

网友评论

      本文标题:基本TCP套接字编程API

      本文链接:https://www.haomeiwen.com/subject/oscknftx.html