客户端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#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>
#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));
}
}
}