📄 chatclient.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 + -