linux socket

#include <sys/types.h>

#include <sys/socket.h>

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

域(domain),又称协议族(protocal family),指定套接字通信中使用的网络介质类型。如AF_UNIX(UNIX文件系统套接字)、AF_INET(UNIX网络套接字)、AF_INET6(用于IPv6)、AF_ISO(ISO标准协议)等。最常用的套接字域是AF_UNIX(代表UNIX文件系统套接字,可用于本地进程间通信)和AF_INET(代表UNIX网络套接字)。

套接字类型,用于指定套接字的通信特性。AF_UNIX域没有这样的问题。对于AF_INET域,type的取值包括 SOCK_STREAM(流,stream)和 SOCK_DGRAP(数据报,datagram)。在AF_INET域中, SOCK_STREAM 通过 TCP/IP 实现, SOCK_DGRAP通过 UDP/IP 实现。

通信所用的协议一般由套接字类型和套接字域来决定,通常不需要选择。一般设为 0,即使用默认协议。


套接字地址:

AF_UNIX域:

struct sockaddr_un {

    sa_family_t  sun_family;    // AF_UNIX

    char             sun_path[ ];   // pathname

};

AF_INET域:   

struct sockaddr_in {

    short int                   sin_family;  // AF_INET

    unsigned short int   sin_port;    // Port number

    struct in_addr          sin_addr;   // Internet address

};

IP地址结构 struct in_addr 被定义为:

struct in_addr {

    unsigned long int    s_addr;

};


主机字节序和网络字节序:

#include <netinet/in.h>

unsigned long int htonl(unsigned long int hostlong);          // host to network, long

unsigned long int ntohl(unsigned long int netlong);           // network to host, long

unsigned short int htons(unsigned short int hostshort);     // host to network, short

unsigned short int ntohs(unsigned short int netshort);       // network to host, short


客户端:

(1)请求连接:

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

成功时,connect 调用返回 0,失败时返回 -1 。具体错误信息可查看 errno 。struct sockaddr *为 struct sockaddr_in *和 struct sockaddr_un *的强制类型转换。


服务器端:

(1)命名套接字:

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

成功时,bind 调用返回 0,失败时返回 -1 。具体错误信息可查看 errno 。struct sockaddr *为 struct sockaddr_in *和 struct sockaddr_un *的强制类型转换。

(2)创建套接字队列:

int listen(int socket, int backlog);

backlog 为队列中可以容纳的未处理连接的最大数目,再往后的连接将被拒绝,导致客户的连接请求失败。、

(3)接受连接

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

如果套接字对列中没有未处理的连接,accept将阻塞,直到有客户建立连接为止。当有未处理的客户连接时,accept函数将返回一个新的套接字文件描述符。发生错误时,accept 将返回 -1。一般需要在循环中处理accept。


TCP/IP读写:

size_t write(int fd, void *buff, size_t nbytes);

size_t read(int fd, void *buff, size_t nbytes);


UDP/IP读写:

int sendto(int sockfd, void *buffer, size_t len, int flags, struct sockaddr *to, socklen_t tolen);

int recvform(int sockfd, void *buffer, size_t len, int flags, struct sockaddr *from, socklen_t fromlen);


关闭socket:

int close(int fd);


实用API:

in_addr_t inet_addr(const char *cp);                       //点分十进制IP转换成网络字节序IP
char*inet_ntoa(struct in_addr in);                         //网络字节序IP转换成点分十进制IP
int inet_aton(const char *string, struct in_addr *addr);   //点分十进制IP转换成网络字节序IP




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值