UDP在线聊天室

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h> 
#include <sqlite3.h>
#include <signal.h>
#include <time.h>
//
//
enum type
{
    Login = 1,
    Chat,
    Quit,
};
//
//
typedef struct msg
{
    int type;
    char name[128];
    char text[128];
} MSG_t;
//
//
int main(int argc, char const *argv[])
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket err\n");
        return -1;
    }

    struct sockaddr_in serveraddr, clientaddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(clientaddr);

    MSG_t msg;
    msg.type = Login;
    printf("please input>>");
    fgets(msg.name, sizeof(msg.name), stdin);
    if (msg.name[strlen(msg.name) - 1] == '\n')
        msg.name[strlen(msg.name) - 1] = '\0';
    sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

    pid_t pid = frok();
    if (pid < 0)
    {
        perror("fork err\n");
        return -1;
    }
    else if (pid == 0)
    {
        while (1)
        {
            fgets(msg.text, sizeof(msg, text), stdin);
            if (msg.text[strlen(msg.text) - 1] == '\n')
            {
                msg.text[strlen(msg.text) - 1] = '\0';
            }
            if (strncmp(msg.text, "quit", 4))
            {
                msg.type = Quit;
                sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
            }
            else
            {
                msg.type = Chat;
                sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
            }
        }
    }
    else
    {
        while(1)
        {
            recvfrom(sockfd,&msg,sizeof(msg),0,(struct sockaddr*)&clientaddr,&len);
            printf("buf:%s\n",buf);
        }
    }
    close(sockfd);
    return 0;
}

服务器:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h> 
#include <sqlite3.h>
#include <signal.h>
#include <time.h>
//
//
enum type
{
    Login = 1,
    Chat,
    Quit,
};
//
//
typedef struct msg
{
    int type;
    char name[128];
    char text[128];
} MSG_t;
//
//
typedef struct node
{
    struct sockaddr_in addr;
    struct node *next;
} listnode, *linklist;
//
//
int main(int argc, char const *argv[])
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket err\n");
        return -1;
    }

    struct sockaddr_in serveraddr, clientaddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(clientaddr);

    if(bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)<0)
    {
        perror("bind err\n");
        return -1;
    }

    int recvbyte;
    char buf[128] = "";
    pid_t pid = fork();
    if(pid<0)
    {
        perror("fork err\n");
        return -1;
    }
    else if(pid == 0)
    {
        while (1)
        {
            linklist p = create();
            if ((recvbyte = recvfrom(sockfd, msg, sizeof(msg), 0, (struct sockaddr *)&clientaddr, &len)) < 0)
            {
                perror("recvfrom err\n");
                return -1;
            }
            switch (msg.type)
            {
            case Login:
                client_Login(sockfd, p, clientaddr, msg);
                break;
            case Chat:
                client_Chat(sockfd, p, clientaddr, msg);
                break;
            case Quit:
                client_Quit(sockfd, p, clientaddr, msg);
                break;
            }
        }
    }
    else
    {
        while(1)
        {
            msg.type = Chat;
            fgets(msg.text,sizeof(msg.text),stdin);
            sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
        }
    }
    return 0;
}
linklist create(void)
{
    linklist p = (linklist)malloc(sizeof(listnode));
    if (NULL == p)
    {
        perror("malloc is err\n");
        return -1;
    }
    p->next = NULL;
    return p;
}
void client_Login(int sockfd, linklist p, struct sockaddr_in clientaddr, MSG_t msg)
{
    sprintf(msg.name "%s Login", msg.text);
    linklist pnew = (linklist)malloc(sizeof(listnode));
    if (NULL == pnew)
    {
        perror("malloc is err\n");
        return -1;
    }
    pnew->addr = clientaddr;
    pnew->next = NULL;

    while (p->next != NULL)
    {
        p = p->next;
        sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&(p->addr), sizeof(p->addr));
    }
    p->next = pnew;
}
void client_Chat(int sockfd, linklist p, struct sockaddr_in clientaddr, MSG_t msg)
{
    sprintf(msg.name, "%s said %s", msg.text);
    while (p->next != NULL)
    {
        if (memcmp(&(p->next->addr), &clientaddr, sizeof(clientaddr)) == 0)
            continue;
        p = p->next;
        sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&(p->addr), sizeof(p->addr));
    }
}
void client_Quit(int sockfd, linklist p, struct sockaddr_in clientaddr, MSG_t msg)
{
    linklist pdel;
    while (p->next != NULL)
    {
        if (memcmp(&(p->next->addr), &clientaddr, sizeof(clientaddr)) == 0)
        {
            pdel = p->next;
            p->next = pdel->next;
            free(pdel);
            pdel = NULL;
        }
        else
        {
            p = p->next;
            sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&(p->addr), sizeof(p->addr));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值