https://www.bilibili.com/video/av54953415?t=5031
从b站学习网络聊天的学习笔记,过滤了其中的废话:
1.电脑要有vmware workstation,没有的请百度解决
其中注意
增强型键盘驱动程序最好勾选,这样在使用虚拟系统时,可以使用键盘!
最后有一个许可证秘钥
提供一个秘钥网站:http://www.windows7en.com/Win7/25762.html
很赞!
新建win7虚拟机教程:
https://blog.csdn.net/qq_43296599/article/details/90287992
2.进入cmd有ipconfig查看电脑的ip地址:
#include<cstdio>
#include<bits/stdc++.h>
#include<WinSock2.h>#pragma comment( lib, "ws2_32.lib")//套接字库int main()
{//1.加载套接字库,初始化WSADATA wd;if( 0 != WSAStartup(MAKEWORD(2,2), &wd) ){printf("加载套接字库失败!\n");printf("错误代码:%d\n", GetLastError() );return 0;}//2.判断版本是否一致if (LOBYTE(wd.wVersion) != 2 || HIBYTE(wd.wVersion) != 2){printf("请求的套接字版本不一致!\n");printf("错误代码:%d\n", GetLastError());return 0;}//3.创建套接字// TCP/IP ==>TCP & UDP// TCP(传输控制协议), 特点:可靠传输、必须建立连接(SOCK_STREAM)// UDP(用户数据报协议),特点:不可靠传输,无需建立连接(SOCK_DGRAM)SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//O表示根据地址格式 和 套接字的类型来选择合适的协议if (sockSrv == INVALID_SOCKET){printf("创建套接字失败!");printf("错误代码:%d\n", GetLastError());return 0;}SOCKADDR_IN addSrv;addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ; //服务器地址绑定本机地址,INADDR_ANY是本地地址,htonl函数转换地址使他可以被识别addSrv.sin_family = AF_INET ;//使用的协议addSrv.sin_port = htons(6940) ;//地址族,电脑端口范围0-65535,一般0-1024留给电脑使用/* htonl & htonsh: http, to, n:net, l:long, s:short*///4.绑定套接字if (SOCKET_ERROR == ::bind(sockSrv, (sockaddr*)&addSrv, sizeof(addSrv))){printf("绑定套接字失败!");printf("错误代码:%d\n", GetLastError());return 0;}printf("创建成功!");return 0;
}
其中第4步的if判断中bind前面要加“::”,不然写上去运行不报错,第二次就有红波浪线了。
运行的话用ctrl+F5,否则vs2019 系统找不到指定的文件(错误代码:0x80070002)
总代码:
#include<stdio.h>
#include<WinSock2.h>
#pragma comment( lib, "ws2_32.lib")//套接字库int main()
{//1.加载套接字库,初始化WSADATA wd;if (0 != WSAStartup(MAKEWORD(2, 2), &wd)){printf("加载套接字库失败!\n");printf("错误代码:%d\n", GetLastError());return 0;}//2.判断版本是否一致if (LOBYTE(wd.wVersion) != 2 || HIBYTE(wd.wVersion) != 2){printf("请求的套接字版本不一致!\n");printf("错误代码:%d\n", GetLastError());return 0;}//3.创建套接字// TCP/IP ==>TCP & UDP// TCP(传输控制协议), 特点:可靠传输、必须建立连接(SOCK_STREAM)// UDP(用户数据报协议),特点:不可靠传输,无需建立连接(SOCK_DGRAM)SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//O表示根据地址格式 和 套接字的类型来选择合适的协议if (sockSrv == INVALID_SOCKET){printf("创建套接字失败!\n");printf("错误代码:%d\n", GetLastError());return 0;}SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //服务器地址绑定本机地址,INADDR_ANY是本地地址,htonl函数转换地址使他可以被识别addrSrv.sin_family = AF_INET;//使用的协议addrSrv.sin_port = htons(6940);//地址族,电脑端口范围0-65535,一般0-1024留给电脑使用/* htonl & htonsh: http, to, n:net, l:long, s:short*///4.绑定套接字if (SOCKET_ERROR == ::bind(sockSrv, (sockaddr*)&addrSrv, sizeof(addrSrv))){printf("绑定套接字失败!\n");printf("错误代码:%d\n", GetLastError());return 0;}//5.将套接字创建为监听模式if (SOCKET_ERROR == listen(sockSrv, 5)) //监听最大长度是5{printf("监听失败!\n");printf("错误代码:%d\n", GetLastError());return 0;}//6.等待客户端的连接请求SOCKADDR_IN addrClient;int length = sizeof(SOCKADDR);while (1){//返回一个建立连接的套接字//192.168.0.103SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &length);printf("欢迎客户端:%s:%d连接服务器\n", inet_ntoa(addrClient.sin_addr), addrClient.sin_port);//inet_ntoa转成4个字节,地址号 端口号}getchar();return 0;
}
客户端:
1.新建项目chatclient,将chatserver的代码复制进chatclient的源文件中
2.修改第3步中第28行 SOCKET sockSrv 改为 SOCKET sockClient
3. 29行 if判断中 sockSrv 改为 sockClient
4.删除 第4 步到第6 步 的部分
5.int main头两行加:
char szIPAddress[16]; //192.168.100.100 16个字符printf("请输入你需要连接的服务器的IP地址:");//10.139.209.0cin >> szIPAddress;
6.第42行 addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
改为
struct in_addr dst;
addrSrv.sin_addr.S_un.S_addr = InetPton(AF_INET, (PCWSTR)szIPAddress, &dst);
7.在后面加上第4步代码:
//4.连接服务器if (SOCKET_ERROR == connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))){printf("连接服务器失败!");printf("错误代码:%d\n", GetLastError());return 0;}