使用UDP协议构建简易局域网内聊天室

实现功能:
 
1.如果有用户登录,其他用户可以收到这个人的登录信息

2.如果有人发送信息,其他用户可以收到这个人的群聊信息

3.如果有人下线,其他用户可以收到这个人的下线信息

4. 服务器可以发送系统信息

代码
服务端:

#include<stdio.h>
#include<pthread.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
#define MAX_LISLEN 2
char buf_write[100];
char buf[100];
int ad[2];
char name[10]="";
int i=0;
struct sockaddr_in server_ip, remote_ip;
void * pthread_fun(void * arg)
{
    while(1)
    {
        bzero(buf,sizeof(buf));
        read(ad[(int )arg],buf,100);
        write(ad[((int )arg + 1) % 2],buf,100);
    }
    return (void *) 0;
}
void * pthread_fun2(void * arg)   //服务器发送信息给所有客户端
{
	while(1)
	{
		int i=0;
		bzero(buf,sizeof(buf));
		scanf("%s",buf_write);
		while(1)
		{
			for(i=0;i<MAX_LISLEN;i++)
			{
				write(ad[(int)arg+i],buf_write,100);
			}
			break;
		}
		return (void *) 0;
	}
}

int main()
{
    pthread_t tid[2],wid[1];
    int server_len , remote_len;
    int error, sd ;
    int i = 0;
    //创建sd
    sd = socket(AF_INET, SOCK_STREAM ,0);
    if(sd == -1)
    {
        perror("create sd failed");
        return -1;
        //close(sd);
    }
    //设置ip,端口
    server_ip.sin_family = AF_INET;
    server_ip.sin_port = htons(5678);
    server_ip.sin_addr.s_addr = htons(INADDR_ANY);
    memset(server_ip.sin_zero,0,8);
    //绑定ip和客户端
    error = bind(sd,(struct sockaddr *) (&server_ip),sizeof(struct sockaddr));
    if(error == -1)
    {
        perror("create bind failed");
        close(sd);
        return -1;
    }
    //设置最大链接数
    error = listen(sd, MAX_LISLEN);
    if(error == -1)
    {
        perror("create listem failed");
        close(sd);
        return -1;
    }
    remote_len = sizeof(struct sockaddr);
    while(1)
    {
        //等待客户端申请
        ad[i] = accept(sd,(struct sockaddr *)(&remote_ip),&remote_len);
        if(ad[i] == -1)
        {
            perror("create ad failed");
            close(sd);
            return -1;
        }  
        else
        {
           printf("client%d 加入聊天室\n",i+1);

		 }
         
        //新线程,功能:不断读数据
        error = pthread_create(&tid[i],NULL,pthread_fun,(void*) i);
        if(error != 0)
        {
            perror("create pthread_fun  failed");
            close(ad[i]);
            close(sd);
			return -1;
		}
		error = pthread_create(&wid[1],NULL,pthread_fun2,(void*) i);
		if(error != 0)
		{
			perror("create pthread_fun  failed");
			close(ad[i]);
			close(sd);
			return -1;
		} 
		i++;
	}
	close(sd);
    return 0;
 
}

客户端:

#include<stdio.h>
#include<pthread.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
int sd;
char buf_write[100];
char buf_read[100];
struct sockaddr_in server_ip, remote_ip;

void * pthread_fun_write(void * arg)
{

    while(1)
    {
        memset(buf_write,0,100);
        scanf("%s",buf_write);
        write(sd,buf_write,100);
    }
}
void * pthread_fun_read(void * arg)
{
	while(1)
	{
	    bzero(buf_read,sizeof(buf_read));
		if(strcmp(buf_read,"退出")==0)
		{
			printf("client2:退出");
			continue;
		}
		read(sd,buf_read,100);
		printf("client2:%s\n",buf_read);

	}
}
 
int main()
{
    int server_len,remote_len;
    pthread_t tid_read,tid_write,tid_name;
    int error;
    sd = socket(AF_INET,SOCK_STREAM,0);
    if(sd == -1)
    {
        perror("create sd failed");
        return -1;
    }
 
    //设置ip,端口
    server_ip.sin_family = AF_INET;
    server_ip.sin_port = htons(5678);
    server_ip.sin_addr.s_addr = htons(INADDR_ANY);
    memset(server_ip.sin_zero,0,8);
  
    //链接服务端
    error = connect(sd, (struct sockaddr *) (&server_ip),sizeof(struct sockaddr));
    if(error == -1)
    {
        perror("create connect failed");
        close(sd);
        return -1;
    }
    error = pthread_create(&tid_write,NULL,pthread_fun_write,NULL);
    if(error != 0)
    {
        perror("create pthread write failed");
        close(sd);
        return -1;
    } 
    error = pthread_create(&tid_read,NULL,pthread_fun_read,NULL);
    if(error != 0)
    {
        perror("create pthread read failed");
        close(sd);
        return -1;
    } 
    pthread_join(tid_write,NULL);
    pthread_join(tid_read,NULL);
    return 0;
}

效果图:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值