三种网络编程方式

2022-02-10 18:38:39 浏览数 (1)

1 socket函数     跨平台 2 Windows socket API     以WSA开头的一组由Win32提供的一组API 3 MFC Socket      MFC对socket封装 CSocket类 面向连接(两端建立连接,进行传递数据) 无连接(数据两端不用建立连接,就可以传递数据) IP协议- IPv4,IPv6 IP协议之上      TCP协议 – 面向连接(采用网络连接方式,可靠网络收发)         http|ftp|telet      UDP协议 – 无连接(采用数据报的方式收发,不可靠网络收发)       winsock2.h//头文件    ws2_32.dll//动态库    ws2_32.lib//lib

代码语言:javascript复制
// Socket头文件和库引入
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

// 初始化Socket库
WSADATA wsa = { 0 };
WSAStartup(MAKEWORD(2, 2), &wsa);//函数初始化Socket库(Socket库的版本号 [Out]Socket的信息)
面向连接实现
服务端
代码语言:javascript复制
// 1)创建socket
SOCKET scoksvr;// 用于保存Socket内核对象
scoksvr = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); // 创建Socket内核对象
if(INVALID_SOCKET == scoksvr)
{// Socket内核对象创建失败
    return;
}

// 2)绑定端口和IP
struct sockaddr_in svraddr = {0};
svraddr.sin_family = AF_INET;//协议族
svraddr.sin_port = htons(6363);//htons改变成网络字节顺序 端口
svraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY所有IP IP地址
//svraddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.64");//指定IP
bind(scoksvr,(struct sockaddr*)&svraddr,sizeof(svraddr));//绑定

// 3)侦听
listen(scoksvr,/*最大侦听数量*/SOMAXCONN);

// 4)接收(等待客户端)
struct sockaddr_in clientaddr = {0};
int nLen = sizeof(clientaddr);
SOCKET socklient = accept(scoksvr,(struct sockaddr*)&clientaddr,&nLen);

// 5)数据收发
//发送数据
//CHAR szSend[100] = "Hello Client";
//send(socklient,szSend,sizeof(szSend),0);
//接收数据
//CHAR szText[100] = {0};
//recv(socklient,szText,100,0);

// 6)关闭socket
closesocket(socklient);
closesocket(scoksvr);
客户端
代码语言:javascript复制
// 1)创建socket
SOCKET sockclient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sockclient)//无效就返回了
{
    return;
}

// 2)连接服务器
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;//协议族
addr.sin_port = htons(6363);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(sockclient,(struct sockaddr*)&addr,sizeof(addr));

// 3)数据收发
//发送
//CHAR szSend[100] = "Hello Server";
//send(sockclient,szSend,sizeof(szSend),0);
//接收
//CHAR szRecv[100] = {0};
//recv(sockclient,szRecv,100,0);
//printf("%sn",szRecv);

// 4)关闭socket
closesocket(sockclient);
面向无连接
服务器
代码语言:javascript复制
// 1)创建Socket
SOCKET socksvr = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (socksvr == INVALID_SOCKET)
{
    printf("无效的Socketn");
    return;
}

// 2)绑定端口和IP
struct sockaddr_in svraddr = {0};
svraddr.sin_family = AF_INET;//协议族
svraddr.sin_port = htons(6363);//htons改变成网络字节顺序 端口
svraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY任意IP IP地址
bind(socksvr,(struct sockaddr*)&svraddr,sizeof(svraddr));

// 3)数据收发
CHAR szRecv[100] = {0};
struct sockaddr_in clientaddr = {0};
int nLen = sizeof(clientaddr);
recvfrom(socksvr,szRecv,100,0,(struct sockaddr*)&clientaddr,&nLen );//收取字符串
printf("%sn",szRecv);

//4)关闭Socket
closesocket(socksvr);
客户端
代码语言:javascript复制
// 1)创建Socket
SOCKET socksvr = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (socksvr == INVALID_SOCKET)
{
    printf("无效的Socketn");
    return;
}

// 2)数据收发(单人发送,单人接收)
char szText[100] = "Hello UDP Server";
struct sockaddr_in svraddr = {0};
svraddr.sin_family = AF_INET;
svraddr.sin_port = htons(6363);
svraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sendto(socksvr,szText,100,0,(struct sockaddr*)&svraddr,sizeof(svraddr));//发送字符串

// 3)关闭Socket
closesocket(socksvr);

应用层 传输层 互联层 主机至网络层(网卡)

参考 RFC文档、TCP/IP三卷

cmd查询 : netstat -an

Linux

代码语言:javascript复制
// 创建Sokcet
SOCKET SockServer;
SockServer = socket(AF_INET,SOCK_DGRAM,17);
if (SockServer == -1)
{
    printf("创建Sockets失败n");
    return -2;
}
printf("创建Socket成功n");
// 绑定IP与端口
struct sockaddr_in addrserver = {0};
addrserver.sin_family = AF_INET;
addrserver.sin_port = htons(1963);
addrserver.sin_addr.S_un.S_addr = inet_addr("192.168.1.2");
if(bind(SockServer,(struct sockaddr*)&addrserver,sizeof(addrserver)) == -1)
{
    printf("绑定IP地址和端口出现错误n");
    return -3;
}
printf("绑定IP地址和端口成功n");

// MSG_WAITALL 接收完成在返回

0 人点赞