?? 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 + -