加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

C++网络编程

发布时间:2021-05-20 14:30:46 所属栏目:大数据 来源: https://blog.csdn.net/dragonf
导读:? 1、IP网络中的每台主机都有一个IP地址; ?? 它是逻辑地址; ?? 因特网上的IP地址具有全球唯一性; ?? 4个字节,192.168.0.16 2、OSI将网络分为???? TCP/IP模型 ?? 应用层??????????? 应用层 ?? 表示层 ?? 会话层 ?? 传输层??????????? 传输层 ?? 网络层????

1、IP网络中的每台主机都有一个IP地址;
?? 它是逻辑地址;
?? 因特网上的IP地址具有全球唯一性;
?? 4个字节,192.168.0.16
2、OSI将网络分为???? TCP/IP模型
?? 应用层??????????? 应用层
?? 表示层
?? 会话层
?? 传输层??????????? 传输层
?? 网络层??????????? 网络层
?? 数据链路层??????? 网络接口
?? 物理层

?? 相同层次之间不可以直接通信,是虚拟通信。下层向上层提供服务,实际通信在最底层完成。各层之

间单向依赖。
3、DNS是将DNS解析为IP地址。
?? 应用层:Telnet、FTP、HTTP、DNS、SMTP、POP3。
?? 传输层:TCP实现数据的完整性,例如下载安装包;UDP实现数据的及时性,例如网络视频电话。
4、数据封装:在数据前面加上特定的协议头部。
5、TCP和UDP可以使用同样的端口,1024以下的端口保留给预定义的服务。windows socket只支持

AF_INET网际域.
6、在网络协议中需要指定网络字节顺序,TCP/IP使用16位整数和32位整数的高位先存格式,PC机采用的

是低位先存格式。
套接字:流式套接字(基于TCP)、数据报套接字(基于UDP),原始套接字。
7、基于TCP的socket编程

?? 服务器端程序:
?? 创建套接字;
?? 将套接字绑定到一个本地地址和端口上bind
?? 将套接字设为监听模式,准备接受客户请求listen
?? 等待客户请求,当请求到来,返回一个新的对应于此次连接的套接字accept
?? 用返回的套接字和客户端进行通信send/recv。
?? 返回,等待另一客户的请求。
?? 关闭套接字。

?? 客户端程序:
?? 创建套接字;
?? 向服务器发送连接请求connect
?? 和服务器进行通信send/recv
?? 关闭套接字。
8、基于UDP的socket编程

?? 服务器端(接收端)程序:
?? 创建套接字
?? 绑定套接字到本地地址和端口上bind
?? 等待接受数据recvfrom
?? 关闭套接字

?? 客户端(发送端)程序:
?? 创建套接字
?? 发送数据sendto
?? 关闭套接字
9、Alt+F8实现代码的整齐。
10、127.0.0.1是回路地址。可以在同一台机子上通信。
11、将两个工程添加到一个工作区中,在工作区中点右键"添加工程"。取消"编译微型条",选中"组建".
12、基于TCP/IP的socket代码:
/*Server.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2,2 );

//加载套接字DLL库
err = WSAStartup( wVersionRequested,&wsaData );
if ( err != 0 )
{
?? return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
?? HIBYTE( wsaData.wVersion ) != 2 )
{
???? //终止使用套接字DLL库????????
?? WSACleanup( );
?? return;
}

??? //1、创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
/*第一个参数对于TCP/IP协议的套接字,只能是AF_INET或PF_INET,第二个参数对于
?? 1.1版本的socket,只支持两种类型的套接字,SOCK_STREAM指定产生流式套接字,
?? SOCK_DGRAM产生数据报套接字,第三个参数为零时自动选择合适的协议。*/

//2、绑定套接字到一个本地地址和端口上
SOCKADDR_IN addSrv;
//htonl是把u_long类型转换为网络字节序
//htons是把u_short类型转换为网络字节序
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
//unsigned?? short?? sin_port;
addSrv.sin_port=htons(4000);
??? bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));

??? //3、将套接字设为监听模式,准备接受客户请求
listen(sockSrv,5);


SOCKADDR_IN addClient;
int len=sizeof(SOCKADDR);
while(1)
{
?? SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addClient,&len);
?? //accept函数第三个参数必须赋初始值,初始值为结构体的长度。否则函数调用失败

??????? //4、用返回的套接字和客户端进行通信
?? char sendBuf[100];
?? sprintf(sendBuf,"hello,haha %s",inet_ntoa(addClient.sin_addr));
?? //inet_ntoa函数是将网络IP地址转换为字符串
?? send(sockConn,sendBuf,strlen(sendBuf)+1,0);
?? char recvBuf[100];
?? recv(sockConn,recvBuf,100,0);
?? printf("%s/n",recvBuf);

??????? //4、关闭套接字
?? closesocket(sockConn);
}
}

/*Client.cpp*/
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2,2 );

err = WSAStartup( wVersionRequested,&wsaData );
if ( err != 0 )
{
?? return;
}

//1、创建套接字
SOCKET sockClient=socket(AF_INET,0);

??? //2、向服务器发送连接请求
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置SOCKET的IP为本机。
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4000);//端口为4000,服务端和客户端的端口一定要相同.否则是连不

上的
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//根据addrSrv连接服务端

??? //3、和服务器进行通信
char recvBuf[100];
recv(sockClient,0);//接收100字符
printf("%s/n",recvBuf);??????? //显示
send(sockClient,"hello",strlen("hello")+1,0);??? //发送一个hello

??? //4、关闭套接字
closesocket(sockClient);??????????? //关闭
WSACleanup();??????????????????????? //清理
}
??
13、基于UDP/IP的socket代码:
/*Server.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2,&wsaData );
if ( err != 0 )
{
?? return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
?? HIBYTE( wsaData.wVersion ) != 2 )
{
???? //终止使用套接字DLL库????????
?? WSACleanup( );
?? return;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4001);

bind(sockSrv,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[50];
recvfrom(sockSrv,50,(SOCKADDR*)&addrClient,&len);
printf("%s/n",recvBuf);

closesocket(sockSrv);
WSACleanup();
}

/*Client.cpp*/
#include<winsock2.h>
#include<stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2,&wsaData );
if ( err != 0 )
{
?? return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
?? HIBYTE( wsaData.wVersion ) != 2 )
{
???? //终止使用套接字DLL库????????
?? WSACleanup( );
?? return;
}

SOCKET sockClient=socket(AF_INET,0);

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(4001);
sendto(sockClient,
?? (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
????
closesocket(sockClient);
WSACleanup();
}
QQ一般都是8080端口或者4000端口
@H_404_333@

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

?
    推荐文章
      热点阅读