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


目录
相关文章
|
8天前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
14天前
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
13天前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
14天前
|
Java API 开发者
Java网络编程基础与Socket通信实战
Java网络编程基础与Socket通信实战
|
14天前
|
Java
Socket网络编程基础教程
Socket网络编程基础教程
|
3天前
|
网络协议 Python
在Python中,我们使用`socket`模块来进行网络通信。首先,我们需要导入这个模块。
在Python中,我们使用`socket`模块来进行网络通信。首先,我们需要导入这个模块。
4 0
|
12天前
|
网络协议 安全 Java
深入了解Java中的网络编程与Socket通信
深入了解Java中的网络编程与Socket通信
|
14天前
|
网络协议 Java
Java网络编程基础与Socket实现技术
Java网络编程基础与Socket实现技术
|
14天前
|
Java
|
15天前
|
网络协议 安全 Java
深入了解Java中的网络编程与Socket通信
深入了解Java中的网络编程与Socket通信