C++ Socket网络编程

C/S架构,服务端和客户端的连接,没有用类封装,C语言风格的C++代码,编译环境VS2022

新建一个文件,然后如图,新建一个C++空项目

 

 下一步是找到该vs文件保存的路径,新建一个tcpSocket文件夹,在tcpSocket文件夹里面新建一个tcpSocket.h和tcpSocket.cpp文件

 

然后回到VS,分别在两个解决方案这里添加现有项,选择刚创建的两个文件,顺手添加两个源文件

 

 然后在Client.cpp和Server.cpp里面添加头文件

#include "../tcpSocket/tcpSocket.h"

接下来就是编写tcpSocket.h文件了

#pragma once
#ifndef _TCPSOCKET_H_
#define _TCPSOCKET_H_
#include <iostream>
#include <stdio.h>
//网络编程,要引用这两个
#include <winsock2.h>                
#pragma comment(lib, "ws2_32.lib")
//后续的连接端口,0~65535,但是在定义时建议使用10000以上的端口,因为存在端口保留和占用的情况
#define PORT 65533
//定义一个err函数,方便后续debug时根据最后的错误获取信息
#define err(errMsg) printf("[line: %d]%s failed code %d\n", __LINE__, errMsg, WSAGetLastError())//该函数用来获取WSA最后发生错误的代码

using namespace std;


//打开网络库
bool init_Socket();
//关闭网络库
bool close_Socket();
//创建服务端socket
SOCKET CreatServerScoket();
//创建客户端socket
SOCKET CreatClientScoket(const char* ip);


#endif // !_TCPSOCKET_H


然后是tcpSocket.cpp文件

#include "tcpSocket.h"

bool init_Socket()
{
	WSADATA data;
	if (WSAStartup(MAKEWORD(2, 2), &data) != 0)
    //Windows socket async :Windows异步套接字,使用前必须要对其进行初始化
	{
		err("WSAStartup");
		return false;
	}
	return true;
}

bool close_Socket()
{
	if (WSACleanup() != 0)
    //使用完了要关闭网络库
	{
		err("WSACleanup");
		return false;
	}
	return true;
}

SOCKET CreatServerScoket()
{
	//1、创建空的socket
	/*
	parm1:AF 地址协议族 IPv4, IPv6
	parm2:type 地址协议类型 流式套接字, 数据报
	parm3:protocol 使用具体的某个传输协议
	*/
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == INVALID_SOCKET)
	{
		err("SOCKET");
	}
	//2、绑定ip地址和端口号
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;//和创建时要一样
	addr.sin_port = htons(PORT);	//把主机字节顺序转换为网络字节顺序
	addr.sin_addr.S_un.S_addr = ADDR_ANY;//inet_addr("127.0.0.1")

	if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
	{
		err("bind");
		return false;
	}
	//3、监听电话:
	listen(fd, 10);
	return fd;
}

SOCKET CreatClientScoket(const char* ip)
{
	//1、创建空的socket
	/*
	parm1:AF 地址协议族 IPv4, IPv6
	parm2:type 地址协议类型 流式套接字, 数据报
	parm3:protocol 使用具体的某个传输协议
	*/
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == INVALID_SOCKET)
	{
		err("SOCKET");
	}
	//2、绑定ip地址和端口号
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;//和创建时要一样
	addr.sin_port = htons(PORT);	//把主机字节顺序转换为网络字节顺序
	addr.sin_addr.S_un.S_addr = inet_addr(ip);
	//3、与服务器建立连接
	if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == INVALID_SOCKET)
	{
		err("connect");
		return false;
	}
	return fd;
}

下一步先写Server服务端

#include "../tcpSocket/tcpSocke.h"

int main()
{
	init_Socket();//初始化网络库

	SOCKET serfd = CreatServerScoket();//创建服务端socket

	cout << "wait client connect...\n";

	SOCKET clifd = accept(serfd, NULL, NULL);	//如果有客户端请求连接
	if (clifd == INVALID_SOCKET)//失败就输出如下错误
	{
		err("accept");
	}

	char buf[BUFSIZ * 2] = { 0 };//定义接收缓冲区并初始化

	if (recv(clifd, buf, BUFSIZ, 0) > 0)//接受并输出
	{
		cout << buf << endl;
	}
	memset(buf, 0, sizeof(buf));//缓冲区初始化,防止后续重复输出


	close_Socket();
	return 0;
}

下一个是客户端

#include "../tcpSocket/tcpSocket.h"

int main()
{
	init_Socket();//创建客户端socket

	SOCKET fd = CreatClientScoket("127.0.0.1");//连接

	char str[] = "connect success";//连接成功

	send(fd, str, strlen(str), 0);

	closesocket(fd);//关闭客户端socket

	close_Socket();//WSACleanup
}

这样就完成了,接下来想要输出更多内容,可以自行使用send和recv函数进行

在debug时,首先将server设置为启动项目,然后CTRL+F5运行server

 接下来如图所示,运行client

 对于debug时报这样的错误,有两种解决方案,第一个是复制这段错误代码,然后在引用的头文件最开始处定义宏

 或者是在client属性之中,C/C++中关闭SDL检查,服务端和客户端都要关闭才行

参考:C/C++基础教程:详细讲解socket网络编程上_哔哩哔哩_bilibili

C/C++基础教程:详细讲解socket网络编程(中)_哔哩哔哩_bilibili

C/C++基础教程:详细讲解socket网络编程(下 )_哔哩哔哩_bilibili

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Socket网络编程是一种在计算机网络中进行数据交互的编程方式。通过使用Socket,我们可以在不同的计算机之间建立网络连接并进行数据传输。 在C语言中,我们可以使用标准库中的socket函数来创建一个Socket。首先,我们需要使用socket函数来创建一个Socket套接字,指定协议和类型。然后,使用bind函数将Socket与一个本地地址绑定,通常是一个IP地址和一个端口号。接着,使用listen函数启动Socket的监听模式,等待其他计算机发起连接请求。 一旦有其他计算机发起连接请求,我们可以使用accept函数来接受连接,并返回一个新的Socket文件描述符,这个新的Socket可以用于与对方进行数据交互。在这之后,我们可以使用send和recv函数来发送和接收数据。 当数据发送完毕或接收完毕后,我们可以使用close函数关闭Socket,释放资源。在进行Socket网络编程时,我们还可以使用select函数来实现多路复用,同时监听多个Socket,提高程序的效率。 在Socket网络编程中,还可以使用一些其他的函数来设置Socket的各种属性,例如设置Socket为非阻塞模式,设置等待时间等。 总之,Socket网络编程提供了一个方便的方式来进行网络通信。通过使用Socket函数及其相关函数,我们可以在C语言中轻松实现网络编程,实现不同计算机之间的数据交互。 ### 回答2: c socket网络编程是一种用C语言编写的网络编程技术,它允许计算机之间通过网络进行通信和数据交换。在C语言中,socket函数库提供了一种方便的方式来创建网络应用程序。 使用C socket网络编程,我们可以通过创建一个套接字(socket)来建立与其他计算机的连接。套接字可以视为两个应用程序之间的通信端口。一个应用程序可以充当服务器(server),等待其他应用程序的连接请求,并接受它们的连接。另一个应用程序可以充当客户端(client),向服务器发送连接请求,并与服务器建立连接。一旦连接建立,我们可以在客户端和服务器之间传递数据。 在进行C socket网络编程时,我们需要使用一些重要的函数,如socket、bind、listen、accept、connect和send/recv等。其中,socket函数用于创建一个套接字,bind函数用于将套接字与本地IP地址和端口绑定,listen函数用于在服务器端开始监听连接请求,accept函数用于接受客户端的连接请求,connect函数用于与服务器建立连接,send/recv函数用于在已经建立的连接上发送和接收数据。 C socket网络编程在实际应用中具有广泛的用途。它可以用于开发各种类型的网络应用程序,如网络聊天室、网络游戏、文件传输、远程控制等。通过使用C socket网络编程技术,我们可以轻松地实现不同计算机之间的通信和数据交换,为用户提供更好的网络体验。 ### 回答3: C语言socket网络编程是指利用socket库函数,通过TCP/IP协议或UDP协议在网络上进行数据通信的一种编程方式。 在C语言中,可以使用socket()函数创建一个套接字,该函数返回一个整数值作为套接字的标识符。创建套接字后,可以使用bind()函数将套接字与本地的IP地址和端口号绑定起来。 对于服务器端程序,可以使用listen()函数设置套接字为监听状态,然后通过accept()函数接受客户端的连接请求。 对于客户端程序,可以使用connect()函数连接到服务器端的套接字。连接成功后,客户端可以使用send()函数发送数据给服务器端,也可以使用recv()函数接收服务器端发送过来的数据。 在网络编程中,需要注意错误处理。例如,当创建套接字或者连接失败时,需要使用perror()函数输出错误信息,并且使用close()函数关闭套接字。此外,还需要使用htons()和htonl()函数将主机字节序转换为网络字节序,以及使用ntohs()和ntohl()函数将网络字节序转换为主机字节序。 socket网络编程还可以使用多线程或多进程实现并发处理,可以同时处理多个连接请求,提高服务器的并发性能。 总之,C语言socket网络编程是一种强大的工具,用于在网络上进行数据通信。它可以使程序与程序之间实现数据的传输和通信,方便地实现分布式系统、网络游戏、即时通信等应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值