c++ win socket网络通信实例

作者:神秘网友 发布时间:2020-09-09 12:44:51

c++ win socket网络通信实例

c++ win socket网络通信实例

c++ win socket网络通信实例
流程:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

服务器端:

#include <iostream>
#include<stdio.h>
#include<WinSock2.h>
#include<cstring>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

/********************全局常量*********************/
const int BUF_SIZE = 2048;
/********************全局变量*********************/
SOCKET sockSer, sockCli;  //socket
SOCKADDR_IN addrSer, addrCli;   //address   SOCKADDR_IN将sin_addr与sin_port分开,方便赋值;SOCKADDR放在一起,方便传输
int naddr = sizeof(SOCKADDR_IN);
char sendbuf[BUF_SIZE];
char inputbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];

int main()
{
	//加载socket库
	WSADATA wsadata;
	if (WSAStartup(MAKEWORD(2, 1), &wsadata) != 0)  //第一个参数,socket版本;第二个参数,socket通过它返回请求socket版本信息
	{
		//输出出错信息
		cout << "载入socket库失败" << endl;
		system("pause");
		return 0;
	}

	//创建socket
	sockSer = socket(AF_INET, SOCK_STREAM, 0);   //第一个参数地址协议族;第二个参数socket类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGARM);第三个参数指定协议,0表示不想指定

	//初始化地址包
	addrSer.sin_addr.s_addr = inet_addr("192.168.1.107");     //inet_addr转换 网络ip 为 网络字节序二进制值 ; S_un是一个联合,S_addr是它的一种数据类型表示; 如果inet_addr报错就关掉VS的SDL安全检查
	addrSer.sin_family = AF_INET;
	addrSer.sin_port = htons(12448);     //1025~43000可任写,未被企业注册,注意防火墙  最大为65535

	//绑定socket
	bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));

	while (1)
	{
		//监听连接请求,将其加入等待队列,等待accpet函数的接收  
		listen(sockSer, 5);  //第一个参数监听连接请求;第二个参数等待连接队列最大长度
		//接受连接请求
		sockCli = accept(sockSer, (SOCKADDR*)&addrCli, &naddr);
		
		if (sockCli != INVALID_SOCKET)  //连接成功
		{
			cout << "连接成功!" << endl;
			strcpy(sendbuf, "hello!");
			//发送数据
			send(sockCli, sendbuf, sizeof(sendbuf), 0);
		}
	}
	
	closesocket(sockSer);
	closesocket(sockCli);
	
	WSACleanup();
	
	return 0;
}

客户端:

#include <iostream>
//#include"stdafx.h"
#include<stdio.h>
#include<WinSock2.h>
#include<cstring>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

/********************全局常量*********************/
const int BUF_SIZE = 2048;
/********************全局变量*********************/
SOCKET sockSer, sockCli;  //socket
SOCKADDR_IN addrSer, addrCli;   //address   SOCKADDR_IN将sin_addr与sin_port分开,方便赋值;SOCKADDR放在一起,方便传输
int naddr = sizeof(SOCKADDR_IN);
char sendbuf[BUF_SIZE];
char inputbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];

int main()
{
	//加载socket库
	WSADATA wsadata;
	if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) {
		//输出出错信息
		cout << "载入socket库失败" << endl;
		system("pause");
		return 0;
	}
	
	//创建socket
	sockCli = socket(AF_INET, SOCK_STREAM, 0);
	//初始化客户端地址包
	addrCli.sin_addr.s_addr = inet_addr("127.0.0.1");
	addrCli.sin_family = AF_INET;
	addrCli.sin_port = htons(12248);

	//初始化服务器地址包
	addrSer.sin_family = AF_INET;
	addrSer.sin_addr.s_addr = inet_addr("192.168.1.107");
	addrSer.sin_port = htons(12448);

	while (1)
	{
		if (connect(sockCli, (SOCKADDR*)&addrSer, sizeof(addrSer)) != SOCKET_ERROR)  //连接成功
		{
			recv(sockCli, recvbuf, sizeof(recvbuf), 0);
			cout << recvbuf << endl;
		}
	}
	
	closesocket(sockSer);
	closesocket(sockCli);
	
	WSACleanup();

	return 0;
}

c++ win socket网络通信实例

c++ win socket网络通信实例相关教程

  1. C++----树状数组
  2. Windows10远程桌面连接提示出现身份验证错误要求的函数不受支持.
  3. Win7/Win10移动用户文件夹(C:\Users)移到非系统盘(如D:)
  4. 进程间通信——自定义消息方式实现(SetWindowsHookEx)
  5. Windows下安装单机zookeeper
  6. WIN10安装MYSQL教程
  7. 在Windows上安装TensorFlow官方文档——翻译
  8. 放弃Windows用国产开源替换政府办公系统这个国家做到了