#include #in" />
当前位置:文档之家› windows环境下C语言多线程实现网络编程,多人聊天室,

windows环境下C语言多线程实现网络编程,多人聊天室,

/***********************服务器************************/#include "stdafx.h"#include <stdio.h>#include <winsock2.h>#include <malloc.h>#include "my_typedef.h"#pragma comment(lib,"ws2_32.lib")#define L_MAX (255)#define C_MAX (100)DWORD WINAPI ThreadProc( /* 线程函数*/ LPVOID lpParam);HANDLE tThread_Client[C_MAX] = {NULL};LNode *pHead;int main(int argc, char* argv[]){//初始化WSAWORD sockVersion = MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0){return 0;}//创建套接字SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INV ALID_SOCKET){printf("socket error !");return 0;}//绑定IP和端口sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("bind error !");}//开始监听if(listen(slisten, C_MAX) == SOCKET_ERROR){printf("listen error !");return 0;}sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);SOCKET sClient = NULL;SOCKET Socket_Sclient = NULL;/* 创建一个链表存放已经连接的客户端*/pHead = (LNode*)malloc(sizeof(LNode));pHead->pNext = NULL;pHead->sClient = NULL;/*循环等待客户端连接,并在连接后创建一个SOCKET和线程*/while (true){int i = 0;printf("等待连接...\n");sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INV ALID_SOCKET){printf("accept error !");continue;}else{Socket_Sclient = sClient;add_Element(pHead,sClient);tThread_Client[i] = CreateThread(NULL, 0, ThreadProc,(LPVOID)Socket_Sclient,printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));i++;}}WSACleanup();return 0;}DWORD WINAPI ThreadProc(LPVOID lpParam){char Rev_Data[L_MAX] = {0};char Send_Data[L_MAX] = {0};//接收数据while( strcmp(Rev_Data,"exit") != 0){int ret = recv((SOCKET)lpParam, Rev_Data, L_MAX, 0);LNode *p = pHead->pNext;if(ret > 0){Rev_Data[ret] = 0x00;//发送数据strcpy(Send_Data,Rev_Data);if(!strcmp(Send_Data,"exit")){printf("一个客户端已经断开连接!\n");}while (p != NULL ){if (p->sClient != (SOCKET)lpParam){send(p->sClient, Send_Data, strlen(Send_Data), 0);p = p->pNext;}else{p = p->pNext;}}}return (0UL);}#include "stdafx.h"#include <stdio.h>#include <winsock2.h>#include <malloc.h>#include "my_typedef.h"INT32 add_Element(LNode *pHead, SOCKET sClient) {INT32 FuncFlag = 0;LNode *p = pHead;LNode *NewNode = NULL;INT32 i32I = 0;if ((NULL == pHead ) || (sClient == NULL)){FuncFlag = -1;}else{while (p->pNext != NULL){p = p->pNext;}NewNode = (LNode *)malloc(sizeof(LNode));NewNode->sClient = sClient;NewNode->pNext = NULL;p->pNext = NewNode;FuncFlag = 1;return FuncFlag;}}#include "stdafx.h"#include <stdio.h>#include <winsock2.h>#include <malloc.h>#include "my_typedef.h"INT32 del_Element(LNode *pHead,SOCKET sClient){INT32 FuncFlag = 0;LNode *p = NULL;LNode *q =NULL;INT32 i32I = 0;if ((NULL == pHead ) || (sClient == NULL)){FuncFlag = -1;}else{p = pHead->pNext;q = pHead;while (p != NULL){if ((p->sClient != sClient)){q = q->pNext;p = p->pNext;}else{q->pNext = p->pNext;free(p);break;}}FuncFlag = 1;}return FuncFlag;}客户端#include <WINSOCK2.H>#include <stdio.h>#include <string.h>#pragma comment(lib,"ws2_32.lib")#define IP_ADDRESS "172.16.10.63"#define M_MAX 1000#define T_MAX 100#define EXIT -2DWORD WINAPI tThread(LPVOID lpParameter) {SOCKET sock = (SOCKET)lpParameter;int ret = 0;char Date_Buffer[M_MAX];while (1){ret = recv(sock, Date_Buffer, M_MAX, 0);printf("\t\t\t\t接收到消息\n\t\t\t\t ");if(!strcmp(Date_Buffer,"exit")){ret = -1;}if(ret > 0){Date_Buffer[ret] = 0x00;printf("%s",Date_Buffer);printf("\n");}else{printf("一个客户端已经断开连接!\n");break;}}return 0;}int main(int argc, char* argv[]){SOCKET sclient;struct sockaddr_in serAddr;char sendData[M_MAX] = "0";char recData[M_MAX] = "0";int ret, i = 1;HANDLE Recv_Thread;/* 初始化WSA */WSADATA data;WORD sockVersion = MAKEWORD(2,2);if(WSAStartup(sockVersion, &data) != 0){return 0;}//创建套接字sclient = socket(AF_INET, SOCK_STREAM, 0);if(sclient == INV ALID_SOCKET){printf("invalid socket !");return 0;}/* 绑定IP和端口*/serAddr.sin_family = AF_INET;serAddr.sin_port = htons(8888);serAddr.sin_addr.S_un.S_addr = inet_addr(IP_ADDRESS);/* 连接服务器*/if (connect(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){printf("connect error !");return 0;}else{printf("已经与服务器连接!\n\n");}Recv_Thread = CreateThread(NULL, 0, tThread, (LPVOID)sclient, 0, NULL);if (Recv_Thread == NULL){printf("Create a thread failure!\n");return 0;}while (1){/* 发送消息*/printf("发送消息\n");gets(sendData);send(sclient, sendData, strlen(sendData), 0);if (!strcmp(sendData, "exit")){ret = EXIT;closesocket(sclient);return 0;}}WaitForSingleObject(Recv_Thread, INFINITE);CloseHandle(Recv_Thread);closesocket(sclient);WSACleanup();return 0;}。

相关主题