服务端 | 客户端 |
---|---|
创建socket | 创建Socket |
开启监听 | |
等待连接 | 发起连接 |
收发消息 | 收发数据 |
初始化socket
初始化环境
linux 不需要
#ifdef WIN32
#define _sock_init( ) { WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData ); }
创建socket
// 1 建立一个 socket 套接字 AF_INET 代表 IPv4 SOCK_STREAM 数据流 协议
SOCKET _sock =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
windows 环境下 需要 初始化 WSADATA 函数
调用 WSAStartup() 函数,参数 MAKEWORD(2, 2) 指定使用 Winsock 2.2 版本,&wsaData 为输出参数,用于接收初始化结果
socket 函数讲解
#if INCL_WINSOCK_API_PROTOTYPES
WINSOCK_API_LINKAGE
_Must_inspect_result_
SOCKET
WSAAPI
socket(
_In_ int af,
_In_ int type,
_In_ int protocol
);
#endif
它有三个参数:
af(Address Family):指定地址族,常见的值有 AF_INET(IPv4)或 AF_INET6(IPv6)。
type:指定 socket 类型,常见值包括 SOCK_STREAM(流式套接字,适用于 TCP)和 SOCK_DGRAM(数据报套接字,适用于 UDP)。
protocol:指定使用的协议,通常为 0 以使用默认协议。对于 AF_INET 和 SOCK_STREAM,协议为 IPPROTO_TCP;对于 AF_INET 和 SOCK_DGRAM,协议为 IPPROTO_UDP。
返回类型 是SOCKET 但是 windows 和liux 的类型 不一样
windows 默认有 INVALID_SOCKET #define INVALID_SOCKET (SOCKET)(~0)
linux 没有 ,返回的是-1 ,可以自定义一个 INVALID_SOCKET 宏 与windows 失败的意义一样即可
绑定
sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(2233);
::inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.s_addr);
sockaddr_in 这个结构体