C++ socket

本文介绍了使用C++进行Socket编程的方法,包括服务器与客户端的实现步骤。文章提供了基于Visual Studio 2017的完整代码示例,并解释了如何处理IP地址与端口绑定等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电脑与电脑之间的通讯其实是Socket与Socket之间的通讯
学习Socket是网络开发的必经之路
学习Socket之前最好有点TCP/IP协议的基础
下图是我在学习过程之中整理的笔记,后期会继续完善
如果看不清右击在新建标签中打开

这里写图片描述

知道网络协议之后便可以开始敲Socket了
先看效果图:
这里写图片描述

下面是SocketC++的源代码

IDE:Visual Studio 2017

其中sin_addr函数过旧
需要把cpp的属性SDL检查关掉
不然编辑器编译不通过

//server
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>							//包含socket的头文件
#pragma comment (lib, "ws2_32.lib")				//加载 ws2_32.dll
int main() {
	WSADATA wsaData;							//定义一个结构体对象
	WSAStartup(MAKEWORD(2, 2), &wsaData);		//初始化WSAStartup()函数,,,(规范的版本号,指向WSADATA结构体的指针),,,MSKEWORD(2,2)主版本号2,副版本号2
	
	SOCKET servSock = socket(PF_INET, SOCK_STREAM, 0);		//参数(1)IP地址类型PF_INET6为IPv6,(2)数据传输方式 SOCK_STREAM 和 SOCK_DGRAM (3)传输协议 IPPROTO_TCP 和 IPPTOTO_UDP,如果写0系统会自动计算处使用那种协议
	sockaddr_in sockAddr;										//创建sockaddr_in结构体变量
	memset(&sockAddr, 0, sizeof(sockAddr));						//每个字节都用0填充
	sockAddr.sin_family = PF_INET;								//使用IPv4地址
	sockAddr.sin_port = htons(1234);							//端口号   要用到htons()函数转换
	sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");			//具体的IP地址32位
	
	bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));				//绑定套接字,
	printf("绑定套接字成功\n");
	listen(servSock, 20);								
	printf("服务器已经进入监听状态\n");
	SOCKADDR clntAddr;
	int nSize = sizeof(SOCKADDR);
	SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);		
	printf("accept函数执行完毕开始接收用户输入\n");

	  
	printf("输入一句话并按回车\n");
	char tack[10];

	scanf("%s", &tack);

	//向客户端发送数据
	send(clntSock, tack, strlen(tack) + sizeof(char), NULL);	

	printf("数据发送成功\n");

	//关闭套接字
	closesocket(clntSock);
	closesocket(servSock);
	//终止 DLL 的使用
	WSACleanup();
	system("PAUSE");
	return 0;
}

//client
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>						//包含WinSock2.h头文件
#pragma comment(lib, "ws2_32.lib")			//加载 ws2_32.dll 
int main() {
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);		//初始化版本
	SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);		//创建用户端socket

	//向服务器发起请求
	sockaddr_in sockAddr;								//创建sockAddr结构体
	memset(&sockAddr, 0, sizeof(sockAddr));				 //每个字节都用0填充
	sockAddr.sin_family = PF_INET;
	sockAddr.sin_port = htons(1234);
	sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));		//建立链接
	printf("客户端发送链接请求\n");


	//接收服务器传回的数据
	char szBuffer[MAXBYTE] = { 0 };
	recv(sock, szBuffer, MAXBYTE, NULL);
	printf("接收服务器传回的消息函数\n");

	//输出接收到的数据
	printf("服务器: %s\n", szBuffer);
	
	//关闭套接字、终止使用 DLL
	closesocket(sock);
	WSACleanup();
	system("PAUSE");
	return 0;
}

在这里插入图片描述
参考https://blog.youkuaiyun.com/qq_36409711/article/details/78937137#commentBox

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值