CC++下TCP,服务器客户端多人聊天室

CC++下TCP,服务器客户端多人聊天室

2023年6月22日发(作者:)

CC++下TCP,服务器客户端多⼈聊天室本次实验利⽤TCP/IP, 语⾔环境为 C/C++利⽤套接字Socket编程,以及线程处理,实现Server/CLient 之间多⼈的聊天系统的基本功能。结果⼤致如:

下⾯贴上代码(参考参考...)Server 部分:

/* - main, TCPdaytimed */#include #include #include #include #include "conio.h"#include "conio.h"#include #include #include #define QLEN 5#define WSVERS MAKEWORD(2, 0)#define BUFLEN 2000 // 缓冲区⼤⼩#pragma comment(lib,"ws2_") //winsock 2.2 library SOCKET msock, ssock; /* master & slave sockets */ SOCKET sockets[100] = {NULL};

int cc; char *pts; /* pointer to time string */ time_t now; /* current time */ char buf[2000]; /* buffer */ char *input; HANDLE hThread1,hThread[100] = {NULL}; unsigned int threadID,ThreadID[100],number; struct sockaddr_in fsin; struct sockaddr_in Sin;unsigned int __stdcall Chat(PVOID PM)

{

char buf1[2000]; char buf2[2000]; char buf3[2000]; char buf4[2000]; (void) time(&now); pts = ctime(&now); sockets[number] = ssock; SOCKET sock = ssock; ThreadID[number] = threadID; unsigned int threadid = threadID; sprintf(buf1," 时间: %s t【我的线程号: %d 】n",pts,threadid); (void) send(sock,buf1, sizeof(buf1), 0);

sprintf(buf2," 线程号 <%d> 客户 enter n",threadid,inet_ntoa(_addr),_port); printf("%s ",buf2);

printf("t将⾃动把此数据发送给所有客户! n"); for(int i=0;i<=number;i++) {

if(sockets[i] != NULL && sockets[i] != sock) { (void) send(sockets[i],buf2, sizeof(buf2), 0);

printf(" 发送⾄线程号<%d>成功!n",ThreadID[i]); } } printf(" n");flag1:cc = recv(sock, buf3, BUFLEN, 0); //cc为接收的字符数 if(cc == SOCKET_ERROR|| cc == 0) { (void) time(&now); pts = ctime(&now); sprintf( buf3," 线程号 <%d> 客户 leave ! n tt时间: %s",threadid,inet_ntoa(_addr),_port,pts); sock = NULL;

sockets[number] = NULL; CloseHandle(hThread[number]); printf("%s ", buf3);

printf("t将⾃动把此数据发送给所有客户! n"); for(int i=0;i<=number;i++) {

if(sockets[i] != NULL && sockets[i] != sock) if(sockets[i] != NULL && sockets[i] != sock) { (void) send(sockets[i], buf3, sizeof(buf3), 0);

printf(" 发送⾄线程号<%d>成功!n",ThreadID[i]); }

} printf(" n"); } else if(cc > 0)

{ (void) time(&now); pts = ctime(&now); sprintf(buf4," 线程号 <%d> 客户说 :%s n tt时间 : %s",threadid,inet_ntoa(_addr),_port,buf3,pts);

printf("%s ",buf4); printf("t将⾃动把此数据发送给所有客户! n"); for(int i=0;i<=number;i++) {

if(sockets[i] != NULL && sockets[i] != sock) { (void) send(sockets[i],buf4, sizeof(buf4), 0);

printf(" 发送⾄线程号<%d>成功!n",ThreadID[i]); }

} printf(" n"); goto flag1; } (void) closesocket(sock);

return 0; }/*------------------------------------------------------------------------ * main - Iterative TCP server for DAYTIME service *------------------------------------------------------------------------ */void main(int argc, char *argv[])

/* argc: 命令⾏参数个数, 例如:C:> TCPdaytimed 8080

argc=2 argv[0]="TCPdaytimed",argv[1]="8080" */{ int alen; /* from-address length */

WSADATA wsadata;

char *service = "5050";

WSAStartup(WSVERS, &wsadata); //加载 winsock 2.2 library msock = socket(PF_INET, SOCK_STREAM, 0); //⽣成套接字。TCP协议号=6, UDP协议号=17 memset(&Sin, 0, sizeof(Sin)); _family = AF_INET; _addr.s_addr = INADDR_ANY; //指定绑定接⼝的IP地址。INADDR_ANY表⽰绑定(监听)所有的接⼝。 _port = htons((u_short)atoi(service)); //atoi--把ascii转化为int,htons - 主机序(host)转化为⽹络序(network), s(short)

bind(msock, (struct sockaddr *)&Sin, sizeof(Sin)); // 绑定端⼝号(和IP地址) listen(msock, 5); //队列长度为5 printf("tttt Chat 多⼈聊天程序 n"); printf("tttt (Server) n"); (void) time(&now); pts = ctime(&now); printf("ttt 时间 :%s",pts); number = -1; while(1) //检测是否有按键 {

alen = sizeof(struct sockaddr); ssock = accept(msock, (struct sockaddr *)&fsin, &alen); number ++; hThread[number] = (HANDLE)_beginthreadex(NULL, 0,Chat,NULL, 0, &threadID);

} (void) closesocket(msock); WSACleanup(); //卸载载 winsock 2.2 library}Client 部分:/* -- ⽤于传递struct */#include #include #include #include #include #include #include #include #define BUFLEN 2000 // 缓冲区⼤⼩#define WSVERS MAKEWORD(2, 0) // 指明版本2.0

#pragma comment(lib,"ws2_") // 指明winsock 2.0 Llibrary/*------------------------------------------------------------------------ * main - TCP client for DAYTIME service *------------------------------------------------------------------------ */

SOCKET sock,sockets[100] = {NULL}; /* socket descriptor */// int cc; /* recv character count */ char *packet = NULL; /* buffer for one line of text */ char *pts,*input; HANDLE hThread; unsigned threadID;unsigned int __stdcall Chat(PVOID PM )

{ time_t now; (void) time(&now); pts = ctime(&now); char buf[2000]; while(1) { int cc = recv(sock, buf, BUFLEN, 0); //cc为接收的字符数 if(cc == SOCKET_ERROR|| cc == 0) { printf("Error: %d.----",GetLastError()); printf("与服务器断开连接!n"); CloseHandle(hThread); (void)closesocket(sock); break; } else if(cc > 0)

{ // buf[cc] = '0'; printf("%sn",buf); // printf("输⼊数据(exit退出): n"); }

} return 0;}int main(int argc, char *argv[]){{ time_t now; (void) time(&now); pts = ctime(&now); char *host = "127.0.0.1"; /* server IP to connect */// char *host = "172.18.33.155";// char *host = "172.18.33.93";// char *host = "172.18.187.1"; char *service = "5050"; /* server port to connect */// char *service = "50000"; struct sockaddr_in sin; /* an Internet endpoint address */ WSADATA wsadata; WSAStartup(WSVERS, &wsadata); /* 启动某版本Socket的DLL */

memset(&sin, 0, sizeof(sin)); _family = AF_INET; _port = htons((u_short)atoi(service)); //atoi:把ascii转化为int. htons:主机序(host)转化为⽹络序(network), s--short _addr.s_addr = inet_addr(host); //如果host为域名,需要先⽤函数gethostbyname把域名转化为IP地址 sock = socket(PF_INET, SOCK_STREAM,0); connect(sock, (struct sockaddr *)&sin, sizeof(sin)); printf("ttttChat 多⼈聊天程序 n"); printf("tttt (Client) n"); hThread = (HANDLE)_beginthreadex(NULL, 0,Chat, NULL, 0, &threadID);

printf(" tttt 【您可以⾃由发⾔】nn"); while(1) { char buf1[2000];

// scanf("%s",&buf1);

gets_s(buf1); if(!strcmp(buf1 ,"exit")) goto end; (void) send(sock,buf1, sizeof(buf1), 0); (void) time(&now); pts = ctime(&now); printf(" 发送成功! ------时间: %sn",pts); }

end: CloseHandle(hThread); closesocket(sock); WSACleanup(); /* 卸载某版本的DLL */

printf("按回车键继续..."); getchar(); return 0; /* exit */}

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687429797a9395.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信