300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > windows网络编程 ---网络聊天室(1)

windows网络编程 ---网络聊天室(1)

时间:2022-10-28 11:12:23

相关推荐

windows网络编程 ---网络聊天室(1)

文章目录

一个简单的网络聊天室服务器端代码 客户端代码

一个简单的网络聊天室

运行如下:

只是实现了一个简单的通信功能,下一节我们再来讨论的IO/CP模型

服务器端

初始化网络环境

int WSAAPI WSAStartup([in] WORDwVersionRequested,//windows套接字规范[out] LPWSADATA lpWSAData//WSADATA的结构体指针);

此函数用来初始化网络环境,通过进程启动 Winsock DLL 的使用。

第一个参数用来指定版本号,我们通常使用MAKEWORD来表示,高顺序字节指定次要版本号;低顺序字节指定主版本号。第二个参数是一个结构体的指针,该结构用于接收 Windows 套接字实现的详细信息(对我们这个项目来说意义不大)创建socket套接字

SOCKET WSAAPI socket([in] int af,//地址族规范[in] int type,//套接字的类型规范[in] int protocol //要使用的协议);

创建绑定到特定传输服务提供者的套接字。

第一个参数:地址族规范,我们可以指定使用什么地址族类型,比如说AF_INET:表示使用IPV4 或者IPV6第二个参数:套接字规范,例如我们使用SOCK_STREAM:表示指定套接字接收IPV4和6的数据流第三个参数:传输控制协议,IPPROTO_TCP:指定IPV4和6的通信协议。绑定套接字和IP地址

INT WSAAPI inet_pton([in] INT Family,//地址族[in] PCSTR pszAddrString,//要转换成文本形式的IP地址[out] PVOID pAddrBuf //IP地址接收的缓冲区);int WSAAPI bind([in] SOCKETs,//套接字[in] const sockaddr *name,//要分配给套接字的本地地址名称(一个sockaddr_in结构体)[in] int namelen//长度);

首先inet_pton将标准文本呈现形式中将 IPv4 或 IPv6 Internet 网络地址转换为其数字二进制形式,然后使用bind绑定函数将本地地址与套接字相关联。

inet_pton

第一个参数: 地址族的规范:使用AF_INET第二个参数:你电脑的IP地址,把这个IP转换为文本型。第三个参数:你将要把这个转换后的IP地址放到什么位置,放到一个sockaddr_in的结构体中

bind:

第一个参数:一开始指定的套接字第二个参数:要和套接字绑定的IP地址,不过它接收一个sockaddr_in的结构体,我们在inet_pton刚把这个IP地址放入在这个结构体中。第三个参数:结构体的大小。监听套接字

int WSAAPI listen([in] SOCKET s,[in] int backlog);

listen: 将套接字置为监听消息的状态。

第一个参数: 你指定的套接字第二个参数:挂起连接队列的最大长度,使用SOMAXCONN即可,系统默认。接收与发送消息

SOCKET WSAAPI accept([in]SOCKET s,[out]sockaddr *addr,[in, out] int*addrlen);int WSAAPI recv([in] SOCKET s,[out] char *buf,[in] int len,[in] int flags);int WSAAPI send([in] SOCKETs,[in] const char *buf,[in] int len,[in] int flags);

accept :连接客户端,侦听客户端消息。

recv : 接收数据。

send:发送数据。

accept :

第一个参数:刚才你listen的套接字第二个参数:指向接收连接实体地址的缓冲区的可选指针,实际上就是连接客户端的一个结构体。第三个参数:结构体大小。

recv send:接收数据,发送数据 ,很简单,不多说

代码

#include <WinSock2.h>#include <Windows.h>#include <iostream>#include <ws2tcpip.h>#pragma comment(lib,"ws2_32.lib")int main(){//1. 初始化网络环境WSADATA WsaData{0 };WSAStartup(MAKEWORD(2, 2),//套接字&WsaData);//2. 创建socket套接字//创建绑定到特定传输服务提供者的套接字。SOCKET serve = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//3. 绑定端口号IP地址sockaddr_in serverAddr{0 };serverAddr.sin_family = AF_INET;//地址族serverAddr.sin_port = htons(666);//端口号//inet_pton:标准文本呈现形式中将 IPv4 或 IPv6 Internet 网络地址转换为其数字二进制形式inet_pton(AF_INET, "172.20.230.126", &serverAddr.sin_addr);//bind:绑定函数将本地地址与套接字相关联。bind(serve, (sockaddr*)&serverAddr, sizeof(serverAddr));//4. 监听//侦听函数将套接字置于侦听传入连接的状态。listen(serve, SOMAXCONN);sockaddr_in ClientAddr{0 };int SockSize = sizeof(ClientAddr);//5. 接收会话while (1){SOCKET client = accept(serve,//标识已使用监听函数处于侦听状态的套接字(sockaddr*)&ClientAddr,&SockSize);WCHAR lpBuff[0x100]{0 };//接收: recv:从连接的套接字或绑定的无连接套接字接收数据。recv(client, (CHAR*)lpBuff, 0x100, NULL);printf("客户:%s\n", lpBuff);//发送: send:在连接的套接字上发送数据。send(client, "欢迎您加入聊天", 14, NULL);}closesocket(serve);system("pause");return 0;}

客户端

客户端的前几步的步骤和服务器端一摸一样,都要有初始化网络环境创建SOCKET套接字

连接 指定的套接字IP地址

ient_pton: IP地址转换int WSAAPI connect([in] SOCKET s,//客户端的套接字[in] const sockaddr *name,//应建立连接的sockaddr结构体指针[in] int namelen//结构体大小);

connect:建立与指定套接字的连接,实际上就是建立客户端与服务器的连接。

发送与接收消息

recvsend

代码

#include <WinSock2.h>#include <Windows.h>#include <WS2tcpip.h>#include <iostream>#pragma comment(lib,"ws2_32.lib")int main(){//1. 初始化网络连接WSADATA WsaData{0 };WSAStartup(MAKEWORD(2, 2), &WsaData);//2. 创建SOCKET套接字SOCKET serve = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//3. 绑定IP地址sockaddr_in serveAddr{0 };serveAddr.sin_family = AF_INET;//地址族serveAddr.sin_port = htons(666);//端口号inet_pton(AF_INET, "172.20.230.126",&serveAddr.sin_addr);//连接服务器//connect函数建立与指定套接字的连接。int result = connect(serve, (sockaddr*)&serveAddr, sizeof(serveAddr));if (result != 0)//未发生错误,返回零{printf("连接失败!\n");system("pause");return 0;}send(serve, "你好啊服务器", 12, NULL);CHAR recvBuff[0x100]{0 };recv(serve, recvBuff, 0x100, NULL);printf("服务器说:%s\n", recvBuff);system("pause");closesocket(serve);return 0;}

两个项目同时生成,首先打开服务器端exe,然后再次打开客户端,就可以做到服务器端和客户端同时相互发送消息了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。