孙鑫老师教学视频学习笔记——网络套接字

OSI七层参考模型:物理层  数据链路层  网络层  传输层  会话层  表示层  应用层 
TCP/IP模型包括4层:网络接口  网络层   传输层   应用层
TCP/IP使用16位整数和32位整数的高位先存格式。
套接字类型:流式套接字(SOCK_STREAM),基于TCP协议;数据报套接字(SOCK_DGRAM)基于UDP协议  
         原始套接字(SOCK_RAW);
基于TCP的socket编程
服务器端程序:(1)创建套接字(socket);(2)将套接字绑定到一个本地地址和端口上(bind);(3)将
套接字设为监听模式,准备接收客户请求(listen);(4)等待客户请求到来,当请求到来时、后,接
受连接请求,返回一个新的对应于此连接的套接字(accept);(5)用返回的套接字和客户端进行通
信(send/recv);(6)返回,等待另一客户请求;(7)关闭套接字。
客户端程序:(1)创建套接字(socket);(2)向服务器发出连接请求(connect);(3)和服务器进行通信
(send/recv);(4)关闭套接字。
基于UDP的socket编程
服务器端(接收端)程序:(1)创建套接字(socket);(2)将套接字绑定到一个本地地址和端口上
(bind);(3)等待接受数据(recvfrom);(4)关闭套接字。
客户端(发送端)程序:(1)创建套接字(socket);(2)向服务器端发送数据(sendto);(3)关闭套接字

///*******************TCP***********************///
//加载套接字库和进行套接字库的版本协商
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
//创建套接字
SOCKET socket(int af, int type, int protocol);
SOCKET socket(AF_INET, SOCK_STREAM,0);
//绑定套接字
int bind(SOCKET s, const struct sockaddr FAR *name, int namelen);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htonl用来转化为网络字节序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
//设置套接字为监听模式
int listen(SOCKET s, int backlog);
listen(sockSrv,5);
//等待客户的连接到来,并接收                     
SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
//发送数据
int send(SOCKET s, const char FAR *buf, int len, int flags);
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);
//接收数据
int recv(SOCKET s, char FAR *buf, int len, int flags);
recv(sockConn, recvBuf, 100, 0);
//关闭套接字
closesocket(sockConn);
//客户端连接服务器端
int connect(SOCKET s, const struct sockaddr FAR *name, int namelen);
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//转化为u_long类型
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//最后用WSACleanup();终止对套接字库的调用,其他的都和服务器端一样
///*******************UDP***********************///
//加载套接字库和进行套接字库的版本协商
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
//创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
//接收数据
int recvfrom(SOCKET s, char FAR *buf, int len, int flags, 
         struct sockaddr FAR *from,int FAR *formlen);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR)
recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
//结束后关闭套接字
closesocket(sockSrv);
WSACleanup();
//客户端发送数据
int sendto(SOCKET s, const char FAR *buf, int len, int flags, 
         const struct sockaddr FAR *to, int tolen);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,"hello",strlen("hello")+1,0,
          (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/170082,如需转载请自行联系原作者
上一篇:我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder


下一篇:Elasticsearch 指南 [7.0] - 快速开始