您的位置:首页 > 理论基础 > 计算机网络

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

2018-02-01 20:20 591 查看
服务器端代码

#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
= 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程 多线程