• 基于TCPIP的网络编程(C++语言编程)


    讲解视频连接:https://www.bilibili.com/video/av36095519

    基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(visual studio下):

    第一部分 服务器端
      一、创建服务器套接字(create)。
      二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
      三、接受来自用户端的连接请求(accept)。
      四、开始数据传输(send/receive)。
      五、关闭套接字(closesocket)。

    第二部分 客户端
      一、创建客户套接字(create)。
      二、与远程服务器进行连接(connect),如被接受则创建接收进程。
      三、开始数据传输(send/receive)。
      四、关闭套接字(closesocket)。

    service:

    #include
    #include
    #include  //WindowsSocket编程头文件
    #include
    #include
    #pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
    using namespace std;
    
    //================全局常量==================
             //创建缓冲区
    const int BUF_SIZE = 2048;
    //================全局变量==================
    SOCKET sockSer, sockCli;
    SOCKADDR_IN addrSer, addrCli; //address
    int naddr = sizeof(SOCKADDR_IN);
    
    char sendbuf[BUF_SIZE];
    char inputbuf[BUF_SIZE];
    char recvbuf[BUF_SIZE];
    //================函数声明==================
    int main() {
    	cout << "服务器启动" << endl;
    	//加载socket库
    	WSADATA wsadata;
    	if (WSAStartup(MAKEWORD(2, 2),&wsadata) != 0)
    	{
    		//输出出错信息
    		cout << "载入socket库失败!" << endl;
    		system("pause");
    		return 0;
    	}
    	else {
    		cout << "载入socket库成功!" << endl;
    	}
    	//创建Soucket;
    	sockSer = socket(AF_INET, SOCK_STREAM, 0);
    	//描述协议族,INET属于ipv4;
    	//sock_stream创建套接字类型:tcp;
    	//0不指定协议,常用的协议有tcp、udp等
    
    	//初始化地址包
    	addrSer.sin_addr.s_addr = inet_addr("192.168.138.1");
    	addrSer.sin_family = AF_INET;
    	addrSer.sin_port = htons(1111);
    
    	//绑定Socket(bind)
    	bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
    	//强制将SOCKADDR_INET转化成SOCKEADDR
    
    	//监听
    	while (true) {
    		cout << "开始连接!" << endl;
    		//监听连接请求;
    		listen(sockSer,5);
    		//等待连接最大数:5
    
    		//接受连接
    		sockCli=accept(sockSer, (SOCKADDR*)&addrCli, &naddr);
    		if (sockCli != INVALID_SOCKET) {
    			while (true)
    			{
    				cout << "连接成功" << endl;
    				cout << "请输入要发送给客户端的信息:" << endl;
    				cin >> sendbuf;
    				send(sockCli, sendbuf, sizeof(sendbuf), 0);
    				//strcpy(sendbuf, "hello");
    				//send(sockCli, sendbuf, sizeof(sendbuf), 0);
    
    				//接收客户端发来信息
    				recv(sockCli, recvbuf, sizeof(recvbuf), 0);
    				cout << "客户端发来的信息:" << recvbuf << endl;
    			}
    			
    		}
    		else
    		{
    			cout << "连接失败!" << endl;
    		}
    	}
    	closesocket(sockSer);
    	closesocket(sockCli);
    	return 0;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    client:

    #include
    #include
    #include  //WindowsSocket编程头文件
    #include
    #include
    #pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
    using namespace std;
    
    //================全局常量==================
    //创建缓冲区
    const int BUF_SIZE = 2048;
    //================全局变量==================
    SOCKET sockSer, sockCli;
    SOCKADDR_IN addrSer, addrCli; //address
    int naddr = sizeof(SOCKADDR_IN);
    
    char sendbuf[BUF_SIZE];
    char inputbuf[BUF_SIZE];
    char recvbuf[BUF_SIZE];
    //================函数声明==================
    int main() {
    	//加载socket库
    	cout << "客户端启动" << endl;
    	WSADATA wsadata;
    	if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
    	{
    		//输出出错信息
    		cout << "载入socket库" << endl;
    		system("pause");
    		return 0;
    	}
    	//创建Soucket;
    	sockCli = socket(AF_INET, SOCK_STREAM, 0);
    	//描述协议族,INET属于ipv4;
    	//sock_stream创建套接字类型:tcp;
    	//0不指定协议,常用的协议有tcp、udp等
    
    	//初始化客户端地址包
    	addrCli.sin_addr.s_addr = inet_addr("127.0.0.1");
    	addrCli.sin_family = AF_INET;
    	addrCli.sin_port = htons(1111);
    
    	//初始化服务器地址
    	addrSer.sin_addr.s_addr = inet_addr("192.168.138.1");
    	addrSer.sin_family = AF_INET;
    	addrSer.sin_port = htons(1111);
    
    	while (true)
    	{
    		if (connect(sockCli, (SOCKADDR*)&addrSer, sizeof(addrSer))!=SOCKET_ERROR)
    		{
    			while (true)
    			{
    				//接收服务器信息
    				cout << "客户端连接成功" << endl;
    				recv(sockCli, recvbuf, sizeof(recvbuf), 0);
    				cout << "服务端发的信息:" << recvbuf << endl;
    				//发送给服务器信息
    				cout << "请输入要发送给服务器的信息:" << endl;
    				cin >> sendbuf;
    
    				send(sockCli, sendbuf, sizeof(sendbuf), 0);
    				cout << "发送成功" << endl;
    			}
    			
    		}
    		else
    		{
    			//cout << "客户端连接失败" << endl;
    		}
    	}
    	closesocket(sockSer);
    	closesocket(sockCli);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
  • 相关阅读:
    关于对象数组的一些方法总结
    面试 Java 并发编程八股文十问十答第十二期
    一起来学Kotlin:概念:8. Kotlin Control Flow: When, For, While, Range 等使用
    MySQL内置函数
    wxpython设计GUI:grid控件实现显示表单数据功能,同时实现界面的上下翻页以及跳转功能
    无需百度网盘SVIP提速不限速满速下载方法,2种方法都亲自实测有效
    内部块拷贝函数memmove和memcpy总结
    腾讯万超:数字孪生迎来产业爆发期,腾讯积极布局
    MES与WMS的区别是什么?
    基于单片机的家居智能系统设计与实现
  • 原文地址:https://blog.csdn.net/m0_54866636/article/details/126565569