socket 表示我们调用操作系统的底层传输,就像一把锁
sockaddr_in 是一个结构体,一个钥匙,放我们允许连接的地址,准备用的端口,用什么协议。
绑定 就是把钥匙插进匹配的锁(对socket文件做了一个标识)
监听 就是拧这个钥匙开锁 就开始工作啦,开始监听
#include <arpa/inet.h>
#include <iostream>
// 宏会在编译之前就执行,比如Linux时就不会有以下的代码
#ifdef WIN32 // 当存在WIN32的宏时,会执行中间的
#include <windows.h>
#else
#include <sys/types.h> /* linux 引用这两个*/
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdlib.h>
#endif
using namespace std;
int main(int argc,char* argv[])
{
unsigned short port=8080;
if (argc>1)
{
port=atoi(argv[1]);//atoi 字符串转化为数字
}
#ifdef WIN32 // 在linux中不需要以下的初始化
// windows 调用socket 库 ,需要1. 初始化动态库 2. 引用lib库
WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);//也加载动态库,引用加1
#endif
int sock=socket(AF_INET,SOCK_STREAM,0);//确定用什么协议,用tcp ip 小于0代表失败
if(sock<0)
{
cout<<"连接失败"<<endl;
return -1;
}
sockaddr_in saddr; //存取ip地址,port
saddr.sin_family=AF_INET; //tcp/ip协议
saddr.sin_port=htons(port); // 统一转化为大端存储(网络默认)
saddr.sin_addr.s_addr=htonl(0);//一个机器可能有多个ip,这里默认任意ip都可以接受
// socket 和 端口ip等信息绑定
if(bind(sock,(sockaddr*)&saddr,sizeof(saddr))!=0)
{
cout<<"绑定失败"<<endl;
return -2;
}
// 每次连接进来,会存一个信息,这个存连接 的列表大小多少
listen(sock,10);//第二个参数是大小,套接字队列的长度
// 每次accept 会减少一个
cout<<"绑定成功"<<endl;
#ifdef WIN32
closesocket(sock);
#else
close(sock);
#endif
cout << sock << endl;
std::cout << "Hello World!\n";
std::cout << "Hello World!\n";
return 0;
}
htons()
x86 是 小尾顺序(字节序噢)