⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatclient.c

📁 实现多线程聊天室
💻 C
字号:

// 我真诚地保证:
    
// 由于技术加时间的原因,我虽然没有完全独立的把整个程序设计出来,但是通过参考上课笔记和
// 同学的源程序我已经把整个程序的流程和细节都搞清楚,并且最终完成了整个程序。
// 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中
// 详细地列举我所遇到的问题,以及别人给我的提示。

// 在此,我感谢张祯老师和鲍承会,吴仁海同学对我的启发和帮助。下面的报告中,我还会具体地提到
// 他们在各个方法对我的帮助。
 
// 我的程序里中凡是引用到其他程序或文档之处,
// 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段,
// 我都已经在程序的注释里很清楚地注明了引用的出处。

// 我从未没抄袭过别人的程序,也没有盗用别人的程序,
// 不管是修改式的抄袭还是原封不动的抄袭。

// 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。
    
// 陈友元(01011105)

//文件名称:chatclient.c
//项目名称:聊天室	
//创建者:陈友元(01011105)
//创建时间:2004-5-31
//最后修改时间:2004-6-3
//功能: 实现多线程聊天室的客户端
//文件中的函数名称和简单功能描述:用来接受其他客户发表的信息
//文件中定义的全局变量和简单功能描述:
//文件中用到的他处定义的全局变量及其出处:
//与其他文件的依赖关系:sock_common.h定义了调用出错


/*以下程序是实现想多线程聊天室的服务起发送信息,并接受来自服务器的但由其他聊天者所说的信息*/
#include "sock_common.h"
#include <process.h>
#include <conio.h>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"libcmt.lib")
#define BUFFER_SIZE    512//定义缓冲大小为512
unsigned __stdcall ProcessThread(void *  p);
unsigned long hThreadHandle;
unsigned uThreadID;
int bquit = 0;
void main(int argc, char *argv[])
{
	WSADATA              wsaData;
	SOCKET               s;//客户机端套接字
	SOCKADDR_IN          ServerAddr;//服务器地址
	int                  Ret;//返回值
	char				 pBuffer[BUFFER_SIZE];//定义接收缓冲
	char ch;

	if (argc <= 2)
	{
		printf("USAGE: %s <Server IP address> <Port number> .\n",argv[0]);//提示信息
		return;
	}
	//初试化低层的Windous Socket DLL失败则提示信息
	if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
	{
		printf("WSAStartup failed with error %d\n", Ret);
		return;
	}
    //创建新套接字失败则提示信息
	if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
	{
		sockerror("Create socket failed!");
		WSACleanup();
		return;
	}
	//构造地址机构失败则提示错误信息
	if(!ConstructSockaddr(&ServerAddr,argv[1],argv[2]))
	{
		printf("Construct Sockaddr error!");
		closesocket(s);
		WSACleanup();
		return;
	}
	//连接服务器失败则提示信息
	if (connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)
	{
		sockerror("Connect to remote failed!");
		closesocket(s);
		WSACleanup();
		return;
	} 
	//创建并初始化线程
	hThreadHandle = _beginthreadex(NULL,0,ProcessThread,(void *)&s,0,&uThreadID);
	CloseHandle((HANDLE) hThreadHandle);
	//以下程序是实现从客户机发送信息给服务器	
	*pBuffer = '\0';
	while(strcmp(pBuffer, "offline") != 0)
	{
		if(strlen(pBuffer) > 0 )
		{
			Ret = WriteN(s,pBuffer,strlen(pBuffer));//如果缓冲区不空则发送缓冲区里的信息
			if (Ret == SOCKET_ERROR)
			{
				sockerror("Send data failed!");
				closesocket(s);
				WSACleanup();
				return;
			}
			Sleep(3);//延时
		}
		else{
			printf("Can't send null char!!\n");//如果缓冲区为空则提示不能发送空信息
		}	
		gets(pBuffer);//从客户机端输入聊天语言
	}
	shutdown(s,SD_SEND);//关闭发送
	while(!bquit);
	closesocket(s);//把套接字从拥有对象参考表中取消
	WSACleanup();//从底层的Windows Sockets DLL中撤消注册
	return ;
}
//以下程序是实现从服务器端接收其他聊天者的聊天记录
unsigned __stdcall ProcessThread(void *  p)
{
	SOCKET s = *((SOCKET *) p);
	char pBuffer[BUFFER_SIZE];//存储聊天记录
	int  Ret;//返回值
	while(1)
	{
		Ret = recv(s,pBuffer,BUFFER_SIZE,0);//从服务器接收信息并存入缓冲中
		if (Ret == SOCKET_ERROR)
		{
			sockerror("Receive data failed!");
			break;
		}
		if (Ret == 0) break;
		pBuffer[Ret] = '\0';
		printf(pBuffer);//在客户机端显示其他聊天者的话
		printf("\n-------------------------------\n");
	}
	bquit = 1;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -