利用Socket在计算机本地实现通信(二)

欢迎访问我的博客:konosuba.xyz

本文主要是在计算机本地使用基于TCP协议的Socket建立服务端与客户端的连接与基本通信

系统:Windows 10

软件:Visual studio 2019

语言:C++


Socket通信实现步骤

  1. 创建ServerSocket和Socket

  2. 打开连接到的Socket的输入/输出流

  3. 按照协议对Socket进行读/写操作

  4. 关闭输入/输出流和Socket

本文的程序由服务端发送信息到客户端,若用户输入quit则结束客户端与服务端程序

服务端Server

由于Windows下的socket程序依赖Winsock.dll或ws2_32.dll,所以必须提前加载

#include <iostream>
#include <string>
#include <winsock2.h> //包含socket的头文件
#pragma comment (lib, "ws2_32.lib")	//加载 ws2_32.dll
#pragma warning(disable:4996)
using namespace std; 

int main() 
{
//****初始化WSA
	WSADATA wsaData;	
	//初始化WSAStartup()函数(规范的版本号,指向WSADATA结构体的指针),向操作系统说明要使用哪个库的文件
	//->MSKEWORD(2,2)主版本号2,副版本号2
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)		
	{				
		return 0; 
	}
	
//****创建套接字
	SOCKET servSock = socket(PF_INET, SOCK_STREAM, 0); 	
		//参数1,IP地址类型,PF_INET6->IPv6,PF_INET->IPv4
		//参数2,数据传输方式,SOCK_STREAM 和 SOCK_DGRAM 
		//参数3,传输协议,IPPROTO_TCP 和 IPPTOTO_UDP,写0系统会自动计算处使用那种协议
	
	//判断无效套接字
	if (servSock == INVALID_SOCKET) 
	{
		cout << "socket error!" << endl; 
		return 0; 
	}
	
//****绑定ip和端口
	
	//创建sockaddr_in结构体变量(in指internet)
	sockaddr_in sockAddr; 
	//每个字节都用0填充
	memset(&sockAddr, 0, sizeof(sockAddr));	
	//使用IPv4地址
	sockAddr.sin_family = PF_INET; 
	//设置端口号,用htons()函数转换
	sockAddr.sin_port = htons(1234); 
	//具体的IP地址,32位
	sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

//****绑定套接字bind()
	//参数1,socket服务器端套接字变量
	//参数2,sockaddr结构体变量的指针,sockaddr_in强转
	//参数3,参数2变量的大小,一般使用sizeof()计算
	if (bind(servSock, (SOCKADDR*)& sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
	{
		cout << "bind error!" << endl; 
		return 0; 
	}
	cout << "绑定套接字成功!" << endl; 

//****开始监听listen()
	//5-最大排队数
	//listen()只让套接字进入监听状态,并没有真正接收请求
	if (listen(servSock, 5) == SOCKET_ERROR) 
	{
		cout << "listen error!" << endl; 
	}
	cout << "服务器已经进入监听状态.." << endl; 

//****接收客户端请求accept()
	//参数与bind()相同
	//accept()会阻塞程序进行,直到有新的请求到来
	//返回一个新的套接字来和客户端通信,后面使用新的套接字通信
	SOCKADDR clntAddr;
	int nSize = sizeof(SOCKADDR);
	SOCKET clntSock = accept(servSock, (SOCKADDR*)& clntAddr, &nSize);
	cout << "accept函数执行完毕开始接收用户输入" << endl;

//****开始通信
	while (1)
	{	
		cout << "输入一句话并按回车(quit退出)" << endl; 
		string input; 
		cin >> input; 

		//向客户端发送数据
		send(clntSock, input.c_str(), input.length(), NULL);
		cout << "数据发送成功" << endl; 

		//如果输入quit,断开连接
		if (input == "quit")
			break; 
	}

	//关闭套接字
	closesocket(clntSock);
	closesocket(servSock);

	//终止 DLL 的使用
	WSACleanup();

	return 0;
}

客户端Client

#include <iostream>
#include <WinSock2.h> //包含WinSock2.h头文件
using namespace std; 
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll 
#pragma warning(disable:4996)

int main() 
{
//****初始化WSA
	WSADATA wsaData;
	//初始化版本
	WSAStartup(MAKEWORD(2, 2), &wsaData);	

//****创建用户端socket	
	SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);		

//****创建sockAddr结构体
	sockaddr_in sockAddr; 
	//每个字节都用0填充
	memset(&sockAddr, 0, sizeof(sockAddr));		
	//绑定服务器、端口		 
	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));
	cout << "客户端发送链接请求" << endl; 

//****接收服务器传回的数据
	while (1)
	{
		char szBuffer[MAXBYTE] = { 0 };
		recv(sock, szBuffer, MAXBYTE, NULL);
		if (strcmp(szBuffer, "quit") == 0)
			break;
		cout << "接受服务器传回的消息函数" << endl;
		cout << szBuffer << endl;
	}

//****关闭套接字、终止使用 DLL
	closesocket(sock);
	WSACleanup();

	return 0;
}

运行测试

先运行服务器端,再运行客户端

启动服务端:

服务端

启动客户端,连接成功

连接成功

发送信息测试:

[外链图片转存失败(img-4vLGyPGb-1568878878676)(https://i.loli.net/2019/07/08/5d22f1fe26de566307.png)]

输入quit,客户端和服务端均结束

结束


实现成功,接下来要测试树莓派与PC在局域网内的Socket通信

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C是一种编程语言,可以使用它进行socket通信Socket是一种网络通信的机制,它允许在不同计算机之间进行数据传输和通信。 在C语言中,可以使用标准C库中的socket相关函数来创建、连接和发送/接收数据。首先,我们需要包含头文件`<sys/types.h>`、`<sys/socket.h>`和`<netinet/in.h>`,以便使用socket函数和相关结构。 要创建一个服务器端的Socket,可以使用socket函数来创建一个套接字,并指定协议族、套接字类型和协议类型。例如,我们可以使用以下代码创建一个TCP/IP的服务器Socket: ``` int server_socket = socket(AF_INET, SOCK_STREAM, 0); ``` 接下来,我们需要使用bind函数将套接字与特定的IP地址和端口号绑定在一起。例如,我们可以使用以下代码将服务器套接字绑定到本地IP地址和端口号8888: ``` struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = INADDR_ANY; server_address.sin_port = htons(8888); bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)); ``` 然后,我们可以使用listen函数将服务器套接字设置为监听状态,可以指定最大连接数。例如: ``` listen(server_socket, 5); ``` 服务器Socket准备好接受传入的连接后,可以使用accept函数来接受客户端的连接请求,并返回一个新的套接字描述符,用于与该客户端进行通信。例如: ``` struct sockaddr_in client_address; int client_socket = accept(server_socket, (struct sockaddr*)&client_address, sizeof(client_address)); ``` 最后,我们可以使用send和recv函数来发送和接收数据。例如,通过以下代码可以发送和接收数据: ``` char message[] = "Hello, client!"; send(client_socket, message, sizeof(message), 0); char buffer[1024]; recv(client_socket, buffer, sizeof(buffer), 0); ``` 以上是使用C语言进行socket通信的基本步骤。通过使用socket相关函数,我们可以实现简单而强大的网络通信应用程序。 ### 回答2: Socket通信计算机网络中常用的通信方式之一,用于实现不同主机之间的数据传输。在C语言中,可以利用socket库来实现Socket通信。 首先,需要引入socket头文件: #include <sys/types.h> #include <sys/socket.h> 然后,可以使用socket函数创建一个套接字: int sockfd = socket(AF_INET, SOCK_STREAM, 0); 其中,AF_INET表示使用IP协议进行通信,SOCK_STREAM表示使用TCP协议。 接下来,需要对套接字进行一系列配置,如绑定本地IP和端口: struct sockaddr_in server; server.sin_family = AF_INET; // 使用IPv4地址 server.sin_port = htons(port); // 设置端口号 server.sin_addr.s_addr = inet_addr(ip); // 设置IP地址 int bindResult = bind(sockfd, (struct sockaddr*)&server, sizeof(server)); 然后,可以使用listen函数监听连接请求: int listenResult = listen(sockfd, backlog); 其中,backlog表示可以等待的最大连接数。 接着,可以使用accept函数接受客户端的连接请求: struct sockaddr_in client; socklen_t clientLen = sizeof(client); int clientSockfd = accept(sockfd, (struct sockaddr*)&client, &clientLen); 此时,clientSockfd为客户端的套接字。 最后,可以使用recv和send函数进行数据的接收和发送: char buffer[1024]; int recvResult = recv(clientSockfd, buffer, sizeof(buffer), 0); int sendResult = send(clientSockfd, buffer, sizeof(buffer), 0); 在数据传输完成后,需要关闭套接字: close(clientSockfd); close(sockfd); 以上就是在C语言中使用socket库进行Socket通信的简单示例。通过这些便捷的函数,我们可以轻松地实现不同主机之间的数据传输。 ### 回答3: C语言是一种通用的编程语言,它可以被用于开发各种类型的应用程序,包括网络应用程序。在网络编程中,C语言可以通过使用socket库来进行socket通信Socket通信是一种在计算机网络中进行数据传输的方式,它允许不同的计算机之间通过网络进行数据交换和通信。在C语言中,通过使用socket库中的函数和结构体,我们可以很方便地实现socket通信。 在进行socket通信时,我们需要有一个服务器端和一个或多个客户端。服务器端负责监听指定的端口号,并接受来自客户端的连接请求。而客户端则负责向指定的服务器IP地址和端口号发起连接请求。一旦连接建立成功,服务器端和客户端之间可以相互发送和接收数据。 在C语言中,我们可以使用socket函数来创建一个socket对象,这个对象可以用于监听、接受连接请求以及发送和接收数据。socket函数可以以特定的地址域、套接字类型和协议参数来创建一个socket。 接下来,我们可以使用bind函数将socket对象与指定的IP地址和端口号绑定,以便服务器端能够监听指定的端口号。然后,我们使用listen函数来开始监听连接请求。 当服务器端接收到客户端的连接请求时,我们可以使用accept函数接受该连接请求,并创建一个新的socket对象来与该客户端进行通信。通过这个新的socket对象,服务器端和客户端可以相互发送和接收数据。 在通信过程中,可以使用recv函数从对方接收数据,并使用send函数将数据发送给对方。数据可以以字节流的形式进行传输。 C语言提供了丰富的函数和数据结构来支持socket通信,开发者可以根据自己的需求进行灵活的编程。通过socket通信,我们可以实现不同计算机之间的数据交换和通信,为应用程序提供了更强大的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值