栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ Winsock进行联机通信

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ Winsock进行联机通信

Winsock是Windows网络编程下的规范,该规范是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。

从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。

Windows Sockets使用套接字进行编程,套接字编程是面向客户端/服务器模型而设计的,因此系统中需要客户端和服务器两个不同类型的进程,根据连接类型的不同,对于面向连接的TCP服务和无连接的UDP服务,服务器分别采取不同的处理操作来对客户提供服务。

面向连接

服务器

socket() -> bind() -> listen() -> accept() -> recv()/send() -> closesocket();

创建套接字,绑定IP和端口,侦听,接收连接,收发消息,关闭连接

客户端

socket() -> connet() -> send()/recv() -> closesocket();

创建套接字,连接服务器,发收消息,关闭连接

有一些小伙伴应该以为Dev c++不能写联机,但其实它可以,具体方法见文末!

好,直接上代码!

服务端:

#include 
#include 
#pragma comment(lib, "ws2_32.lib")
using namespace std;

int main() {
    WSADATA wsdata;
	WSAStartup(MAKEWORd(2, 2), &wsdata);

	SOCKET hServSock = socket(PF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port = htons(4096);
	bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr));

	listen(hServSock, 5);

	SOCKADDR_IN clntAddr;
    int clntAddrSz = sizeof(clntAddr);
	SOCKET hSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntAddrSz); // 等待连接

    // 到了这里就已经有电脑连上去了!
    cout << "连接成功!" << endl;
    char s[1024] = "发送的信息";
    send(hSock, s, 1024, 0);
    cout << "已发送信息!" << endl;
    system("pause");
    return 0;
}

服务端运行后会等待客户端来连接,然后给客户端发一条信息,客户端也可以给服务端发送信息!

客户端:

#include 
#include 
#pragma comment(lib, "ws2_32.lib")
using namespace std;

int main() {
	WSADATA wsdata;
	WSAStartup(MAKEWORd(2, 2), &wsdata);

	SOCKET hSock = socket(PF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 127.0.0.1要改成运行服务端的电脑的IP,推荐把它的IP固定住,方法自行查询!
	servAddr.sin_port = htons(4096);

	connect(hSock, (SOCKADDR*)&servAddr, sizeof(servAddr)); // 连接服务端
    char s[1024] = {};
    recv(hSock, s, 1024, 0); // 等待对方发送信息,然后接收到s数组中,读1024个字符
    cout << s << endl;
    system("pause");
    return 0;
}

切记,切记,一定要先运行服务端,不然会出错!运行服务端后再运行客户端,然后客户端连接上服务端后就接收服务端的信息到字符数组s里去,然后输出,具体怎么用请自行修改!

用dev c++也能运行这段代码的方法:首先,在dev c++中点击工具,然后点击编译选项,把编译时加入以下命令选上,然后把里面的内容改成-std=c++11,然后再勾选在连接器命令行加入以下命令,然后把里面的内容改成-static-libgcc -l wsock32就可以了。 

我的运行效果是

服务端:

客户端:

 

好,这就说明我们已经成功了! 

都看到这里了,给作者点个赞吧~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号