欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux socket 编程总结

程序员文章站 2022-07-15 18:36:20
...

#include<sys/types.h>

#include<sys/socket.h>

int socket(int domain, int type, int protocol);


domain参数 可指定的协议族

说明
AF_UNIX UINX域协议(文件系统套接字)
AF_INET ARPA因特网协议(UNIX套接字)
AF_ISO ISO标准协议
AF_NS 施乐(Xerox)网络系统协议
AF_IPX Novell IPX协议
AF_APPLETA;LK Appletalk DDS


type

SOCK_STREAM    和 SOCK_DGRAM


套接字地址

AF_UNIX 套接字来说,它的地址由sockaddr_un来描述,该结构定义在头文件sys/un.h中

struct sockaddr_un{
    sa_family_t   sun_family;/*AF_UNIX*/
    char          sun_path[];/*pathname*/
}
在AF_INET域中,套接字地址由sockaddr_in来指定,该结构定义在netinet/in.h中,它至少包含以下几个成员:

struct sockaddr_in{
    short int          sin_family;/*AF_UNIX*/
    unsigned short int sin_port;/*Port number*/
    struct in_addr     sin_addr;/**Internet address/
}
IP地址结构in_addr被定义为:

struct in_addr{
    unsigned long int s_addr;
}

命名套接字

#include<sys/socket.h>
int bind(int socket, const struct sockaddr *address, size_t address_len);
地址的长度和格式取决于地址族,如上。需要强制转换成需要的结构(struct sockaddr *)

创建套接字队列

#include <sys/socket.h>
int listen(int socket, int backlog);

backlog 设置队列中可以容纳的未处理链接的最大数目


接受连接

#include <sys/socket.h>

int accept(int socket, struct sockaddr *address, size_t *address_len);

返回新的套接字的描述符,第2个参数返回客户的地址,第3个参数返回客户地址的长度

如果套接字队列中没有未处理的连接,accecpt函数将阻塞直到客户建立连接为止。我们可以通过对套接字文件描述符设置O_NONBLOCK标志来改变这一行为,使用函数是fnctl:

int flags = fnctl(socket,F_GETFL,0);

fnctl(socket, F_SETFL,O_NONBLOCK|flags);

请求连接

#include<sys/socket.h>
int connect(int socker, const struct sockaddr *address, size_t address_len);

参数socket指定的套接字将连接到参数address指定的服务器套接字,address指向的结构的长度由参数address_len指定。

主机字节序&&网络字节序

不同类型的计算机使用不同的字节序来表示整数,如大小端,解释字节的方式。因此需要定义一个网络字节序使得各个设备之间保持一致。

#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

套接字选项

#include <sys/socket.h>

int setsockopt(int sock, int level, int option_name,const void *option_value, size_t option_len);

选项 说明
SO_DEBUG 打开调试信息
SO_KEEPALIVE 通过定时传输保持存活报文来维持了连接
SO_LINGER 在close调用返回之前完成传输工作


网络信息

主机数据库在接口头文件netdb.h中声明


#include <netdb.h>
struct hostent *gethostbyaddr(const void *addr, size_t len, int type);
struct hostent *gethostbyname(const char *name);

struct hostent {
    char *h_name;/*name of the host*/
    char **h_aliases;/*list of aliases(nicknames)*/
    int h_addrtype;/*address type*/
    int h_length;/*length in bytes of the address*/
    char **h_addr_list/*list of address (network order)*/
};

与服务及其相关的信息可以通过一些服务函数来获取

#include <netdb.h>

struct servent {
    char *s_name; /*name of the service*/
    char **s_aliases; /*list of aliases(alternative names)*/
    int s_port;/*The IP port number*/
    char *s_proto; /*The service type , unsually "tcp" or "udp"*/
};

#include <arpa/inet.h>

char *inet_ntoa(struct in_addr in);

这个函数的作用是:将一个因特网主机地址转换为一个点分四元组式的字符串

#include <inistd.h>

int gethostname(char *name, int namelength);

这个函数的作用是:将当前主机的名字写入name指向的字符串。若主机名将被截断

tips:

通过killall serve1来杀死程序