linux网络编程:服务器与客户机模拟聊天(多线程)

服务器端代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <pthread.h>
#include <unistd.h>

#define SERVER_PORT 4321
#define BUF_SIZE 1024
#define LISNUM 5
int recv_flag = 1;
int main(){
	int sock_fd, new_fd;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;

	int sin_size,myport,lisnum;
	int n;
	char buff[BUF_SIZE+1];
	//char temp[BUF_SIZE+1];
	char temp[BUF_SIZE+1];
	bool usb_connect,net_connect ;
	int on = 1;
	pthread_t s_usb2net_id,s_net2usb_id;


	if ((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){
		perror("socket");
		exit(1);
	}

	/* Enable address reuse */
	setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

	bzero(&server_addr,sizeof(struct sockaddr_in));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(SERVER_PORT);

	if(bind(sock_fd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)) == -1){
		perror("bind");
		exit(1);
	}
	
	printf("Bind success, welcome to server!\n");
	
	if(listen(sock_fd,LISNUM) == -1){
		perror("listen");
		exit(1);
	}
	printf("Listening....\n");
	while(1){
		//recv_flag = 0;
		sin_size = sizeof(struct sockaddr_in);

		if ((new_fd = accept(sock_fd,(struct sockaddr *)&(client_addr),&sin_size))==-1) {
			perror("accept");
//			continue;
			exit(1);
		}else{
				if(send(new_fd,"connect to server success!",30,0) == -1){
					perror("send");
					close(new_fd);
				    exit(0);
				}
		}

		
		

		/*the read and send thread */
		void *send_thread(void *arg){
			
		
			while(1){
				scanf("%s", temp);
				if(send(new_fd,temp,strlen(temp),0) == -1){
					perror("send");
					
				}else{
					printf("server send success!\n");
				}
			}
		}

		/*the receive and write thread */
   		void *recv_thread(void *arg){
			while(1){
				bzero(buff,BUF_SIZE+1);
				if ( (n = recv(new_fd,buff,BUF_SIZE,0 ))== -1) {
					perror("server recv ERROR");
				}
				buff[n] = 0;
				if(n > 0){
					if(recv_flag%2 == 0)
					printf("Server receive a massage from client:%s\n",buff);
					recv_flag++;
					//printf("------%d\n", recv_flag);
					//break;
					continue;
				}
			}
		}


		/* create the receive and write thread */
		if(pthread_create(&s_net2usb_id,NULL,recv_thread,NULL)){
			printf("recv_thread is created failed!\n");
		}


		/* create the read  and send thread */
		if(pthread_create(&s_usb2net_id,NULL,send_thread,NULL)){
			printf("send_thread is created failed!\n");
		}
		
		if((pthread_join(s_net2usb_id,NULL)) != 0){
			perror("pthread_join ERROR");
		}
		if((pthread_join(s_usb2net_id,NULL)) != 0){
			perror("pthread_join ERROR");
		}
		


	}
	close(sock_fd);
	exit(0);
}


客户端代码


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <pthread.h>

#define MAXDATASIZE 1024
#define PORT	4321
int main(int argc, char *argv[]){
	int sockfd, portnumber,nbytes;
	char buff[MAXDATASIZE];
	char temp[MAXDATASIZE];
	bool conn = true,sendthread = true;
	struct hostent *he;
	struct sockaddr_in server_addr;
	int i;
	pthread_t c_usb2net_id,c_net2usb_id;
	
	if(argc != 3){
		fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");
		exit(1);
	}

	/*if ( (portnumber = atoi(argv[2])) < 0 ) {
		fprintf(stderr,"Usage:%s  hostname portnumber\a\n",argv[0]);
		exit(1);

	}*/

	if ( (he = gethostbyname(argv[1])) == NULL ) {
		perror("gethostbyname");
		exit(1);
	}

	if ( (sockfd = socket(AF_INET,SOCK_STREAM,0))== -1) {
		perror("socket");
		exit(1);
	}

	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr = *((struct in_addr *)he->h_addr);
	
	while(1){

		while(conn){
			if(connect(sockfd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1){
				perror("connect");
				exit(1);
			}
			conn = false;
		}

		/*****************   the send thread function ********************/
		void *send_thread(void *arg){
			i=0;i++;
			printf("send thread ------>%d\n",i);
			while(1){
				scanf("%s", buff);
				if(send(sockfd,buff,strlen(buff),0) == -1){
					perror("send");
					//				  close(sockfd);
				}else if(send(sockfd,buff,strlen(buff),0) == 0){
					printf("----> clinet is ranking and waiting!\n");
				}else{
					printf("----> clinet send success!\n");
				}
			}
		}
		
		/* create the thread */
		while(sendthread){
			if(pthread_create(&c_usb2net_id,NULL,send_thread,NULL)){
				printf("C_UsbtoNet_thread is created failed!\n");
				sendthread = true;
			}
			sendthread = false;
		}
		

		/**************** the receive action in the main thread ***********/
		bzero(temp,MAXDATASIZE+1);
		if ( (nbytes = recv(sockfd,temp,MAXDATASIZE,0 ))== -1) {
			perror("server recv ERROR");
			//exit(1);
		}
		temp[nbytes] = 0;
		if(nbytes > 0){
			printf("clinet receive a massage from server:%s\n",temp);
		}

	}
	close(sockfd);
	exit(0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值