基本TCP套接字编程API

2018-09-22  本文已影响0人  m风满楼
套接字地址结构:
#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

获取套接字的地址信息

#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);
//返回:指向一个点分十进制数串的指针
上一篇 下一篇

猜你喜欢

热点阅读