socket函数
linux下的socket函数:
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
参数:
domain 套接字中使用的协议族信息
type 套接字数据传输类型信息
protocol 计算机间通信中使用的协议信息
返回值:
成功:返回文件描述符
失败:返回 -1
windows下的socket函数:
#include<winsock2.h>
SOCKET socket(int af, int type, int protocol);
参数:
domain 套接字中使用的协议族信息
type 套接字数据传输类型信息
protocol 计算机间通信中使用的协议信息
返回值:
成功:返回socket句柄
失败:返回 INVALID_SOCKET
参数一 (domain):
协议族(Protocol Family)
PF_INET IPV4互联网协议族
PF_INET6 IPV6互联网协议族
PF_LOCAL 本地通信的UNIX协议族
PF_PACKET 底层套接字的协议族
PF_IPX IPX Novell协议族
参数二(type)
SOCK_STREAM 面向连接套接字
SOCK_DGRAM 面向消息套接字
参数三(protocol)
IPPROTO_TCP
IPPROTO_UDP
地址信息表示(sockaddr_in结构体)
struct sockaddr_in
{
sa_family_t sin_family; //地址族
uint16_t sin_port; //16位TCP/UDP端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //不使用
}
struct in_addr
{
in_addr_t s_addr; //32位IPV4地址
}
此sockaddr_in结构体用于bind函数中,
bind(SOCKET s, const struct sockaddr* name, int namelen);
成功返回 0 失败返回 SOCKET_ERROR
举例:
//1,创建监听套接字
hServSock = socket(PF_INET, SOCK_STREAM, 0);
if (hServSock == INVALID_SOCKET)
{
cout << "申请发送套接字失败" << endl;
}
//2 ,绑定本地IP接口
SOCKADDR_IN servAdr;
memset(&servAdr, 0, sizeof(servAdr));
servAdr.sin_family = AF_INET; //地址族
servAdr.sin_port = htons(9999); //端口,主机转网络字节序
servAdr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定本地IP
if (bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR)
{
cout << "bind error" << endl;
}
字节序转换
unsigned short htons(unsigned short)
unsigned short ntohs(unsigned short)
unsigned long htonl(unsigned long)
unsigned long ntohl(unsigned long)
h代表主机字节序
n代表网络字节序
s代表short
l代表long
将字符串转换成点分十进制32位整数型数据
wchar_t adr[] = L"192.168.19.1";
InetPton(AF_INET, adr, &servAdr.sin_addr); // 服务器IP地址