在网络编程中,socket是初学者必须跨过的一个障碍,但是在初学的时候这个概念非常抽象,所以这里菜雄用一个自己理解的具象实例来引入这个抽象的概念。
这一篇只关注于TCP的socket代码的理解,如果要了解其它细节,那么听下回有空再分解:
TCP的socket可以理解为一个安装电话机到拆除电话机的过程。
服务器端 逐语句解释:
1、创建socket对象:
(购买一个电话机,后面的参数可以理解为电话机的型号)
SOCKET serv_fd= socket(AF_INET , SOCK_STREAM , 0);
第一个参数:该socket用的是ipv4 还是ipv6 还是其他的?
第二个参数:该socket的实现方式:是流 还是 报文?(对应的是TCP 还是 UDP?)
第三个参数:默认填写0,会根据前面两个参数自行匹配。
2、绑定socket对象:
(电话机买回来,要将电话卡号设置进去,就好比手机里要放电话卡,否者打不通电话)
SOCKADDR_IN servAdr; //理解为电话卡
servAdr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //理解为电话机是哪个社区的?(上海的还是北京的?)
servAdr.sin_family = AF_INET; //用的是电信该是移动?
servAdr.sin_port = htons(9527); //社区里面的具体地址
bind(serv_fd, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) //将电话卡和这个电话机进行绑定
第一个参数:用哪一个电话机
第二个参数:用哪一个电话卡号
第三个参数:电话卡号的长度是多少?
3、监听:
(为了防止电话机有电话进来没人接,拍指牛13的接电话人去接听)
listen(serv_fd, 5)
第一个参数:要听的哪一部电话机
第二个参数:这个人很牛13,能同时接听打进来几个电话,如果超过这个数,就打不进来了,会表示正在通话中。
4、接受:
(牛13的接电话人将对方号码信息记录下来)
SOCKET clnt_fd; //对方的电话机
SOCKADDR_IN clnt_addr; //对方电话机的详细信息保存的地址
int clnt_size = sizeof(clnt_addr); //地址的长度
clnt_fd = accept(serv_fd, (SOCKADDR*)&clnt_addr, &clnt_size);
//接电话的将对方的电话号码记到clnt_fd上,并将对方电话机的详细信息记到clnt_addr上。
第一个参数:接听的哪一部电话机
第二个参数:对方电话机的详细信息保存的地址
第三个参数:详细信息的长度
5、接受和发送:
(听别人讲什么,讲给别人听什么)
recv(clnt_fd, szMsg, MAX_BUFF_SIZE,0) //接听别人的信息
send(clnt_fd, msg, len, 0); //传递自己的信息
第一个参数:和哪一个号码进行交流
第二个参数:表达信息保存的开始地址
第三个参数:表达信息的长度
第四个参数:填0,历史遗留问题
6、关闭:
(电话机不用了就丢掉,在家占地方,还浪费钱)
closesocket(serv_fd);
第一个参数:丢的是哪一个电话机