基于多线程的网络聊天室

基于多线程的网络聊天室

上次学习了一下基于多线程的网络聊天室项目,一直都没时间去整理代码,今天终于整理了一下这个项目的代码。
首先大概介绍下基于TCP/IP协议是如何建立起服务器和客户端之间的关系的几个基本步骤:
Server(服务器)								Client(客户端)
1、确定协议版本;								1、确定协议版本;
2、创建socket;									2、创建socket;
3、创建服务器协议地址族;						3、获取服务器协议地址族;
4、绑定;
5、监听;
6、接受客户端连接;								4、连接服务器
7、通信;										5、通信
8、断开连接;									6、断开连接
9、清理协议版本信息								7、清理协议版本信息
//这是服务器端的代码
#include <stdio.h>

#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>

#pragma warning(disable:4996)
int main(void)
{
	//基于TCP/IP协议建立服务器和客户端之间的关系
	//1、确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 ||
	HIBYTE(wsaData.wVersion != 2))
	{
		printf("确定协议版本失败!\n");
	}
	printf("确定协议版本成功!\n");

	//2、创建socket
	SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if (SOCKET_ERROR == serverSocket)
	{
		printf("创建socket失败:%d\n",GetLastError());
		//9、清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("创建socket成功!\n");

	//3、创建服务器协议地址族(就是ip和端口号)
	SOCKADDR_IN addr = {0};
	addr.sin_family = AF_INET;//协议地址族
	addr.sin_addr.S_un.S_addr = inet_addr("192.168.31.102");//电脑换了SSID,其IP地址得及时改变。
	addr.sin_port = htons(10086);//10000左右,小端转大端。

	//4、绑定
	int r = bind(serverSocket, (struct sockaddr*)&addr, sizeof addr);
	if (-1 == r)
	{
		printf("绑定失败:%d\n", GetLastError());
		//8、关闭socket
		closesocket(serverSocket);

		//9、清理协议版本信息
		WSACleanup();
		return -3;
	}
	printf("绑定成功!\n");

	//5、监听
	r = listen(serverSocket,10);
	if (-1 == r)
	{
		printf("监听失败:%d\n", GetLastError());
		//8、关闭socket
		closesocket(serverSocket);
		//9、清理协议版本信息
		WSACleanup();
		return -3;
	}
	printf("监听成功!\n");

	//6、等待客户端连接
	SOCKADDR_IN cAddr = {0};
	int len = sizeof cAddr;
	SOCKET clientSocket = accept(serverSocket,(sockaddr*)&cAddr,&len);
	if (SOCKET_ERROR == clientSocket)
	{
		printf("客户端连接失败:%d\n", GetLastError());
		//9、清理协议版本信息
		WSACleanup();
		return -4;
	}
	printf("客户端连接成功!\n");

	//7、通信
	char buff[1024];

	while (1)
	{
		r = recv(clientSocket, buff, 1023, NULL);
		if (r > 0)
		{
			buff[r] = 0;
			printf("%s发来的数据:%s\n",inet_ntoa(cAddr.sin_addr),buff);
		}
	}

	//8、关闭socket
	closesocket(serverSocket);
	//9、清理协议版本信息
	WSACleanup();



	//while (1);//暂停控制台窗口为了便于观看!

	//system("pause");//不适应我的系统环境
	return 0;

}
//这是客户端代码
#include <stdio.h>

#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>

#pragma warning(disable:4996)
int fun(void)
{
	//基于TCP/IP协议建立服务器和客户端之间的关系
	//1、确定协议版本
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (LOBYTE(wsaData.wVersion) != 2 ||
		HIBYTE(wsaData.wVersion != 2))
	{
		printf("确定协议版本失败!\n");
	}
	printf("确定协议版本成功!\n");

	//2、创建socket
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (SOCKET_ERROR == clientSocket)
	{
		printf("创建socket失败:%d\n", GetLastError());
		//9、清理协议版本信息
		WSACleanup();
		return -2;
	}
	printf("创建socket成功!\n");

	//3、获取服务器协议地址族(就是ip和端口号)
	SOCKADDR_IN addr = { 0 };
	addr.sin_family = AF_INET;//协议地址族
	addr.sin_addr.S_un.S_addr = inet_addr("192.168.31.102");//电脑换了SSID,其IP地址得及时改变。
	addr.sin_port = htons(10086);//10000左右,小端转大端。

	//4、连接服务器
	int r = connect(clientSocket, (sockaddr*)&addr, sizeof addr);
	if (-1 == r)
	{
		printf("连接服务器失败:%d\n",GetLastError());
		//6、关闭socket
		closesocket(clientSocket);
		//7、清理协议版本信息
		WSACleanup();
		return -1;
	}
	printf("连接服务器成功!\n");


	//5、通信
	char buff[1024];

	while (1)
	{
		scanf("%s",buff);//接受客户端用户输入
		send(clientSocket, buff, strlen(buff), NULL);//发送给服务器
	}

	//8、关闭socket
	closesocket(clientSocket);
	//9、清理协议版本信息
	WSACleanup();



	//while (1);//暂停控制台窗口为了便于观看!

	//system("pause");//不适应我的系统环境
	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值