創(chuàng)建套接字
套接字描述符類似于文件描述符,UNIX、Linux把網(wǎng)絡(luò)當(dāng)文件看待卤橄,發(fā)送數(shù)據(jù)即寫文件write佳鳖,接收數(shù) 據(jù)即讀文件read隘梨,銷毀socket對象即關(guān)閉文件close毛俏,在UNIX、Linux系統(tǒng)下一切皆文件。
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
功能:在內(nèi)核中創(chuàng)建一個套接字對象
domain:通信地址類型
AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(進(jìn)程間通信)
AF_INET: 基于IPv4(32位IP地址)的網(wǎng)絡(luò)通信
AF_INET6: 基于IPv6(128位IP地址)的網(wǎng)絡(luò)通信
type:通信協(xié)議類型
SOCK_STREAM: 數(shù)據(jù)流協(xié)議益眉,即TCP協(xié)議
SOCK_DGRAM: 數(shù)據(jù)報協(xié)議,即UDP協(xié)議
protocol:特別通信協(xié)議姥份,一般不用郭脂,置0即可
返回值:成功返回套接字描述符,失敗返回-1
套接字的連接
當(dāng)socket對象創(chuàng)建好以后澈歉,它并不能立即與其它socket對象無法找到它展鸡,需要把一個地址與它進(jìn)行綁 定,這樣它才能被其它socket對象連接并通信埃难。
// 基本地址類型莹弊,它是socket系列接口的表面參數(shù)涤久,而實際使用的是sockaddr_un或sockaddr_in
struct sockaddr
{
sa_family_t sa_family; // 地址類型,與創(chuàng)建socket對象時的domain參數(shù)一至即可
char sa_data[14]; // 它是只是占位而已
};
// 本地地址類型
#include <sys/un.h>
struct sockaddr_un
{
sa_family_t sun_family;
char sun_path[]; // 套接字文件路徑
};
// 網(wǎng)絡(luò)地址類型
#include <netinet/in.h>
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port; // 端口號忍弛,用于區(qū)分通信方的進(jìn)程响迂,1024~65535
struct in_addr sin_addr; // IP地址
};
struct in_addr
{
in_addr_t s_addr; // 32位IPv4地址
};
typedef uint32_t in_addr_t;
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
功能:將套接字和通信地址綁定在一起
addr:sockaddr_un、sockaddr_in結(jié)構(gòu)變量的地址
addrlen:地址結(jié)構(gòu)變量的字節(jié)數(shù)细疚,便于bind區(qū)分用戶提供的是sockaddr_un或sockaddr_in
返回值:成功返回0蔗彤,失敗返回-1
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
功能:socket對象A連接socket對象B
sockfd:socket對象A的描述符,也就是連接的發(fā)起者
addr:socket對象B的通信地址疯兼,socket對象B必須與該通信地址綁定過
addrlen:地址結(jié)構(gòu)變量的字節(jié)數(shù)
返回值:成功返回0然遏,失敗返回-1