C++ 实现简单Tcp服务器端

使用C++基于windows平台下实现Tcp服务器端

main.cpp


#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>

using namespace std;

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


int main() {

	//初始化winsock2.2相关的动态库
	WSADATA wd; // 获取socket相关信息
	if(0 != WSAStartup(MAKEWORD(2, 2), &wd)) { //0 表示成功
		cout << "WSAStartup error: " << WSAGetLastError() << endl;
		return 0;
	}
	
	//1. 创建TCP socket 流式套接字
	SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(INVALID_SOCKET == s) {
		cout << "socket error :" << WSAGetLastError() << endl;
		return 0;
	}

	//2. 绑定socket到一个IP地址和端口
	sockaddr_in addr; //不建议使用sockaddr 建议用sockaddr_in
	addr.sin_family = AF_INET; // 地址族
	addr.sin_port = htons(8888);//本地端口 转网络字节序
	//addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//ip地址转网络字节序 inet_addr只能为ipv4转换 属于低版本 不建议用
	inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);//ip地址转网络字节序

	int len = sizeof(sockaddr_in);
	if(SOCKET_ERROR == bind(s, (sockaddr*)&addr, len)) {
		cout << "bind error: "<< WSAGetLastError() <<endl;
		return 0;
	}

	//3. 监听, 5 代表正在等待完成相应的TCP三次握手过程的队列长度
	if(SOCKET_ERROR == listen(s, 5)) { // 根据电脑配置设定链接数
		cout << "listen error:"<< WSAGetLastError() << endl;
		return 0;
	}

	//4. 接受客户端请求,并且返回和客户端通讯的套接字
	sockaddr_in addrClient; //保存客户端IP地址端口
	memset(&addrClient, 0, sizeof(sockaddr_in));
	len = sizeof(sockaddr_in);
	SOCKET c = accept(s, (sockaddr*)& addrClient, &len); //成功返回套接字
	if(INVALID_SOCKET == c) {
		cout << "accept error:" << WSAGetLastError()<< endl;
		return 0;
	}

	//5. 发送 接受消息
	int ret = 0;
	do {
		//向刚连接的客户端发送数据, 不能用监听套接字,而应该用accept返回的套接字 c
		char str[20] = "I am server!";
		ret = send(c, str, strlen(str), 0);//把flag置0
		
		//接受客户端的消息
		char buf[64] = {'\0'};
		char *address = new char;
		ret = recv(c, buf, 64, 0); //把flag置 0
		//cout << "recv" << inet_ntoa(addrClient.sin_addr) << ":   " << buf << endl; //inet_ntoa 转换为IP字符串   inet_ntoa只能为ipv4转换 属于低版本 不建议用
		cout << "recv : " << inet_ntop(AF_INET, (void*)&addrClient.sin_addr, address, sizeof(SOCKADDR_IN)) << ":   " << buf << endl; //inet_ntoa 转换为IP字符串
	} while(ret != SOCKET_ERROR && ret != 0); //对方关闭 返回0 , 错误返回 SOCKET_ERROR


	//6. 关闭套接字
	closesocket(s);

	//清理winsock环境
	WSACleanup();

	return 0;
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中实现基于TCP协议的服务器和客户端通信,需要使用Socket编程。下面是一些基本步骤: 1. 建立服务器 首先需要建立服务器端的socket。通过调用socket()函数创建服务器socket,指定socket的协议族(通常是AF_INET,即IPv4),socket类型(通常是SOCK_STREAM,即TCP流式套接字),和端口号。之后调用bind()函数把服务器socket绑定到指定的地址和端口。接下来就可以调用listen()函数开始监听客户端连接请求。 2. 连接客户端 客户端需要调用socket()函数创建socket,同样指定协议族、socket类型和端口号(这里可以随机指定一个未占用的端口号)。之后调用connect()函数连接服务器的地址和端口号即可。 3. 通信 一旦客户端和服务器端建立连接,就可以通过读写socket进行通信。服务器端需要调用accept()函数接受客户端连接请求,返回一个新的socket描述符用于和客户端进行通信。之后可以使用send()函数向客户端发送数据,使用recv()函数从客户端接收数据。客户端同样可以使用send()和recv()函数进行通信。 4. 结束连接 通信结束后,服务器和客户端需要分别调用close()函数关闭链接。 以上是基于TCP协议的服务器和客户端通信的基本步骤,具体实现过程需要详细的代码实现。在实际开发中,还需要注意处理错误和异常情况,以保证程序的稳定性和安全性。 ### 回答2: 基于TCP协议的服务器和客户端通信是一种常见的网络通讯方式。服务器在网络上侦听特定端口,接收客户端的连接请求。当连接建立后,服务器和客户端之间可以进行数据传输。 实现基于TCP协议的服务器和客户端通信,需要遵循以下步骤: 1. 创建服务器端的套接字(socket)并绑定IP地址和端口号。 2. 监听客户端的连接请求,等待客户端连接。 3. 接受客户端的连接请求,创建一个与客户端通信的套接字。 4. 使用套接字进行数据传输,包括从客户端接收请求和向客户端发送响应。 5. 当通信完成后,关闭连接并释放资源。 对于客户端,需要以下步骤: 1. 创建客户端的套接字。 2. 连接服务器套接字。 3. 发送请求数据给服务器。 4. 接收服务器响应数据。 5. 关闭连接并释放资源。 在实现过程中,还需要注意以下方面: 1. 使用正确的IP地址和端口号进行通信。 2. 服务器端需要使用多线程或多进程进行并发处理,以支持多个客户端同时连接。 3. 通信过程中需要加入一定的数据校验和错误处理机制,以提高通讯的可靠性。 总之,基于TCP协议的服务器和客户端通信是一种灵活、可靠的网络通讯方式,可以广泛应用于各种网络场景中,例如打印、文件传输、远程控制等。 ### 回答3: C 11是一种编程语言,可以用来实现基于TCP的服务器和客户端通信。TCP是传输控制协议的缩写,它提供了一种可靠的数据传输方式,被广泛用于互联网上的通信。 要实现基于TCP的服务器和客户端通信,需要用C 11语言编写两个程序:一个服务器程序和一个客户端程序。服务器程序在运行时监听一个指定的端口,等待客户端程序的连接请求。当客户端请求连接时,服务器程序接受连接请求,并创建一个新的进程或线程用于处理这个连接。 在服务器程序和客户端程序之间进行数据传输时,需要使用TCP协议提供的套接字接口。服务器程序和客户端程序都可以通过套接字接口创建一个套接字,用于进行数据传输。服务器程序可以使用accept函数来接受连接请求,而客户端程序可以使用connect函数来连接服务器。 一旦连接建立,服务器程序和客户端程序之间就可以通过套接字进行数据传输了。服务器程序可以使用send函数将数据发送给客户端程序,而客户端程序可以使用recv函数接收服务器发送的数据。数据传输结束后,服务器程序和客户端程序都可以使用close函数关闭套接字。 总之,用C 11语言编写基于TCP的服务器和客户端通信程序需要了解TCP协议、套接字接口和相应的函数,熟练掌握C 11编程语言,并具有相应的开发经验和编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值