C++网络通信 Socket

简介: C++网络通信 Socket

目录


服务端:


客户端:


客户端第二种写法:不使用inet_pton函数


服务端:

#include <iostream>


#include <stdio.h>


#include <winsock2.h>


#include <Ws2tcpip.h>


#pragma comment(lib,"ws2_32.lib")


#define _WINSOCK_DEPRECATED_NO_WARNINGS 1


using namespace std;


int main(int argc, char* argv[])


{


   //初始化WSA


   WORD sockVersion = MAKEWORD(2, 2);


   WSADATA wsaData;


   if (WSAStartup(sockVersion, &wsaData) != 0)


   {


       return 0;


   }


   //创建套接字


   SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


   if (slisten == INVALID_SOCKET)


   {


       printf("socket error !");


       return 0;


   }


   //绑定IP和端口


   sockaddr_in sin;


   sin.sin_family = AF_INET;


   sin.sin_port = htons(8888);


   sin.sin_addr.S_un.S_addr = INADDR_ANY;


   if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)


   {


       printf("bind error !");


   }


   //开始监听


   if (listen(slisten, 5) == SOCKET_ERROR)


   {


       printf("listen error !");


       return 0;


   }


   //循环接收数据


   SOCKET sClient;


   sockaddr_in remoteAddr;


   int nAddrlen = sizeof(remoteAddr);


   char revData[255];


   while (true)


   {


       printf("等待连接...\n");


       sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);


       if (sClient == INVALID_SOCKET)


       {


           printf("accept error !");


           continue;


       }


       char ip[100];


       if (inet_ntop(AF_INET, &remoteAddr.sin_addr.S_un.S_addr, ip, 100) == NULL)


       {


           cout << "error" << endl;


           return -1;


       }


       cout << ip << endl; //宽字符记得用宽字符的方式进行输出


       //接收数据


       int ret = recv(sClient, revData, 255, 0);


       if (ret > 0)


       {


           revData[ret] = 0x00;


           printf(revData);


       }


       //发送数据


       const char * sendData = "你好,TCP客户端!\n";


       send(sClient, sendData, strlen(sendData), 0);


       closesocket(sClient);


   }


   closesocket(slisten);


   WSACleanup();


   return 0;


}


客户端:

#include<iostream>


#include<WINSOCK2.H>


#include<STDIO.H>


#include<cstring>


#include <Ws2tcpip.h>


#pragma comment(lib, "ws2_32.lib")


#define _WINSOCK_DEPRECATED_NO_WARNINGS 1


using namespace std;


int main()


{


   WORD sockVersion = MAKEWORD(2, 2);


   WSADATA data;


   if (WSAStartup(sockVersion, &data) != 0)


   {


       return 0;


   }


   while (true) {


       SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


       if (sclient == INVALID_SOCKET)


       {


           printf("invalid socket!");


           return 0;


       }



       sockaddr_in serAddr;


       serAddr.sin_family = AF_INET;


       serAddr.sin_port = htons(8888);


       inet_pton(AF_INET, "127.0.0.1", &serAddr.sin_addr.S_un.S_addr);


       if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)


       {  //连接失败


           printf("connect error !");


           closesocket(sclient);


           return 0;


       }



       char data[1024];


       cin >> data;


       const char * sendData;


       sendData = data;   //string转const char*


       //char * sendData = "你好,TCP服务端,我是客户端\n";


       send(sclient, sendData, strlen(sendData), 0);


       //send()用来将数据由指定的socket传给对方主机


       //int send(int s, const void * msg, int len, unsigned int flags)


       //s为已建立好连接的socket,msg指向数据内容,len则为数据长度,参数flags一般设0


       //成功则返回实际传送出去的字符数,失败返回-1,错误原因存于error


       char recData[255];


       int ret = recv(sclient, recData, 255, 0);


       if (ret > 0) {


           recData[ret] = 0x00;


           printf(recData);


       }


       closesocket(sclient);


   }


   WSACleanup();


   return 0;



}


客户端第二种写法:不使用inet_pton函数

#include<iostream>


#define _WINSOCK_DEPRECATED_NO_WARNINGS 1


#include<WINSOCK2.H>


#include<STDIO.H>


#include<cstring>



#pragma comment(lib, "ws2_32.lib")



using namespace std;


int main()


{


   WORD sockVersion = MAKEWORD(2, 2);


   WSADATA data;


   if (WSAStartup(sockVersion, &data) != 0)


   {


       return 0;


   }


   while (true) {


       SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);


       if (sclient == INVALID_SOCKET)


       {


           printf("invalid socket!");


           return 0;


       }



       sockaddr_in serAddr;


       serAddr.sin_family = AF_INET;


       serAddr.sin_port = htons(8888);


       serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");


       if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)


       {  //连接失败


           printf("connect error !");


           closesocket(sclient);


           return 0;


       }


       char data[1024];


       cin >> data;


       const char * sendData;


       sendData = data;   //string转const char*


       //char * sendData = "你好,TCP服务端,我是客户端\n";


       send(sclient, sendData, strlen(sendData), 0);


       char recData[255];


       int ret = recv(sclient, recData, 255, 0);


       if (ret > 0) {


           recData[ret] = 0x00;


           printf(recData);


       }


       closesocket(sclient);


   }


   WSACleanup();


   return 0;


}

tt.png


目录
相关文章
|
1月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
44 6
|
14天前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
16 1
|
17天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
15 1
|
23天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
25天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
1月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
24 0
|
1月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
|
2月前
|
网络协议 Linux C++
超级好用的C++实用库之网络
超级好用的C++实用库之网络
44 0
|
2月前
|
网络协议
关于套接字socket的网络通信。&聊天系统 聊天软件
关于套接字socket的网络通信。&聊天系统 聊天软件
|
4月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
51 4
下一篇
无影云桌面