Socket:
socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
SOCKET的流程:
正如它的直译,它的功能也就像插座一样。(经典的比喻是电话网,这里不再赘述)(括号中是事实上的对象)
对供应商(server)来说:1. 先装(申请)一个插座(socket)
2. 把插座(socket)登记到电网中的固定位置(bind)
3. 坐等用户(client)连接(listen)
4. 接受用户的连接申请(accept)
5. 进行数据交换(read&write)
6. 关闭连接(close)
这里面要特殊说明的一点是accept部分,服务器accept以后并不是直接在当前插座上与用户交流,而是会返回一个 新socket ,这个socket和用户相连。可以想象用户的线头刚刚从插座里钻出来,就被listening的server accept:抓到旁边一个新socket里面,从而 空出 那个对外的socket继续接收别人的connect申请。
而对用户来说:
1. 装一个插座(socket)
2. 连接(connect)供应商(server)
3. 取电付费(read&write)
4. 不用了关掉(close)
如此便完成了不同程序之间( 即不一定非要不同电脑,也可以用于进程之间 )的信息传递。
详细流程:
来自:点击打开链接
要注意的是函数失败后linux返回的是-1,windows返回SOCKET_ERROR(等于-1)。windows下用GCC似乎还要加-lwsock32命令。windows下返回的数据类型是SOCKET(然而也只是对u_int的包装而已),linux下返回int。即socket的代号。下文为了区分SOCKET与别的数据类型统一以SOCKET来做套接字的类型。
1.头文件
对于windows:
#include<winsock2.h>
然后还需要初始化socket的DLL:
WSADATA wsaData;
WSAStartup(0x202,&wsaData);