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

📄 client.cpp

📁 调用线程pthread 加锁和解锁的功能
💻 CPP
字号:
using namespace std;
#include <string.h>//pour memcpy au moins
#include <stdio.h>//perror
#include <sys/types.h>

//#include <iostream>
//#include <netinet/in.h>
//#include <netdb.h>
//#include <arpa/inet.h>
#include <sys/socket.h>
#include <fstream>
#include <pthread.h>
#include <poll.h>
#include <unistd.h>

#include "sock.h"
#include "sockdist.h"
#ifndef INFTIM
	#define INFTIM			-1
#endif
const	int	PORT = 8081;
const	int	MAX_CONNECT = 1000;
const	int MAX_USER = MAX_CONNECT;
int		sockfd;

struct User
{
	char		name[32];
	int             tcp_sock;
    unsigned int        tcp_addr;
    unsigned short      tcp_port;
};


main(int argc, char*argv[])
{
	void		*ReadMsg(void *);
	pthread_t		t_readMsg;				
	struct		pollfd	client[MAX_USER];			
	int		nReady,i,maxPoll,msgSize;
	int		ret;
	char	userid[32];
	char	buffer[1024];
	char	number[100][4]={"0","1","2","3","4","5","6","7","8","9"};
	char	msg[512];
	char	dispMes[512];
	//string dispMes;	char	name[32];	
	char	choice;
	const	char	sayAll[]=" Says to ALL:";
	const	char	says[]= " Says:";
	struct	User user[MAX_USER];
	socklen_t	clilen;
	struct sockaddr_in      caddr,client_addr; 
	char	serverIP[20];
	string	hostIP;

	cout << "Please input the Host name:" <<endl;
	cin >> serverIP;

	SockDist distBr(serverIP,(short)PORT);
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	sockaddr_in *sdistBr = distBr.getAdrDist();

	ret = connect(sockfd,(struct	sockaddr *) sdistBr, sizeof(struct	sockaddr));
	if (ret != 0)
	{
		cout << "Connect to Server Failed" <<endl;
		exit(1);
	}
	cout << "Connect to Server Successful!" <<endl;
	cout << "Login name: (lenght is limited in 30 letters)" <<endl;
	cin >> name;		
	strcpy(userid,name);
	pthread_create(&t_readMsg,NULL,ReadMsg,NULL);
	sleep(1);

	cout << "***************** Notice ***********************"<<endl;
	cout << "\tType 3:Talk to All \n\tType 4:List All users \n\tType 9:Exit Chat!"<<endl;
	cout << "***************** Notice ***********************"<<endl;
	msg[0]= '1';
	for (int m=0;m<32 ;m++ )
	{
		msg[m+1]=userid[m];
	}
	send(sockfd,msg,sizeof(msg),MSG_NOSIGNAL); 

	//cout << userid << endl;
	while (1)
	{		//char check[512]="/return";		sleep(1);	
		cout << "choice:3-Chat to all | 4-Exit | 5-list all users | '/return' - return to list:"<<endl;	
		cin >> &choice;		
		switch (choice)
		{
		case '3':			cout << "Chat Input:";			while (strncmp(dispMes,"/return",8))			{			bzero(&msg,sizeof(msg));
			bzero(&dispMes,sizeof(dispMes));			msg[0]= '3';			cin >>dispMes;			{ 
				int m;
				for (m=0;m<strlen(userid) ;m++ )
				{
					msg[m+1]=userid[m];
				}
				//strcat(msg," Says:");
				for (int n=0;n<strlen(sayAll) ; n++)
				{
					msg[m+1]=sayAll[n];
					m++;
				}
				for (int n=0;n<strlen(dispMes) ; n++)
				{
					msg[m+1]=dispMes[n];
					m++;
				}
				//strcat(msg,dispMes);
			}
			send(sockfd,msg,sizeof(msg),MSG_NOSIGNAL);			}			bzero(&msg,sizeof(msg));
			bzero(&dispMes,sizeof(dispMes)); 
			break;

		case '4':
			close(sockfd);
			return 1;
			break;


		case '5':
			bzero(&msg,sizeof(msg));
			msg[0]= '9';
			send(sockfd,msg,sizeof(msg),MSG_NOSIGNAL); 
			break;

		default:
			cout <<"Input incorrect"<<endl;			
			break;			
		}
	}
	/* on peut commencer `a dialoguer, mais on attend que le <<serveur>> existe */
	cout <<"ici client ; s'assurer que le serveur existe"<<endl;
	cout <<"des qu'on veut continuer, return (entrée) svp"<<endl;
  
}//main


void *ReadMsg(void *)
{
	char dispBuffer[1024];

	while(1)
	{
		bzero(dispBuffer,sizeof(dispBuffer));
		if(recv(sockfd,(void *)dispBuffer, sizeof(dispBuffer), 0) <= 0) 
		{
			cout<< "Connetion Error"<<endl;
			pthread_exit(0);
		}

		cout<<dispBuffer<<endl;

	}
}

⌨️ 快捷键说明

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