客户端
chat.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<fcntl.h>
#include"../head.h"
void handler(int argc){
while(waitpid(-1,NULL,WNOHANG)>0);
exit(0);
}
int main(int argc, const char *argv[])
{
signal(17,handler);
int usfd = socket(AF_INET,SOCK_DGRAM,0);
if(usfd<0)
{
perror("socket");
return -1;
}
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(1025);
cin.sin_addr.s_addr= inet_addr("192.168.8.102");
socklen_t sizeodcin=sizeof(cin);
char buf[128]="";
char login[10]="";
printf("please input login\n");
scanf("%s",login);
if(!strcmp(login,"login")){
char name[20]="";
printf("please input name\n");
scanf("%s",name);
int size = sprintf(buf,"%s%s",login,name);
sendto(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeodcin);
pid_t cid = fork();
if(cid==0){
while (1)
{
bzero(buf,sizeof(buf));
scanf("%s",buf);
sendto(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeodcin);
if(!strcmp(buf,"quit")){
break;
}
}
exit(0);
}else if(cid>0){
while (1)
{
recvfrom(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&sizeodcin);
printf("%s\n",buf);
}
}else{
perror("fork");
}
}else{
printf("login error\n");
}
close(usfd);
return 0;
}
服务器端
chats.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<fcntl.h>
#include"../head.h"
typedef struct node{
union{
struct sockaddr_in cin;
int len;
};
struct node *next;
}*linksock;
linksock create_space(int flag)
{
linksock ls=(linksock)malloc(sizeof(struct node));
if(NULL==ls)
{
return NULL;
}
if(1==flag)
{
ls->len=0;
}else{
ls->cin.sin_family=AF_INET;
ls->cin.sin_port = htons(0);
ls->cin.sin_addr.s_addr = inet_addr("192.168.8.102");
}
ls->next=NULL;
return ls;
}
void add_link(linksock L,int port){
linksock q=L;
int flag=0;
while(q->next)
{
q=q->next;
if(q->cin.sin_port == htons(port)){
flag++;
}
}
if(0==flag){
linksock s=create_space(0);
if(NULL==s)
return ;
s->cin.sin_port = htons(port);
q->next=s;
L->len++;
}
}
int main(int argc, const char *argv[])
{
int usfd = socket(AF_INET,SOCK_DGRAM,0);
if(usfd<0)
{
perror("socket");
return -1;
}
linksock L =create_space(1);
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(1025);
cin.sin_addr.s_addr= inet_addr("192.168.8.102");
socklen_t sizeodcin=sizeof(cin);
char buf[128]="";
while (1)
{
bind(usfd,(struct sockaddr*)&cin,sizeodcin);
recvfrom(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&sizeodcin);
if(1025!=ntohs(cin.sin_port)){
add_link(L,ntohs(cin.sin_port));
}
if(!strcmp(buf,"quit"))
{
linksock s=L;
while(s->next)
{
if(s->next->cin.sin_port==cin.sin_port){
linksock ss=s->next;
s->next=ss->next;
break;
}
s=s->next;
}
free(ss);
ss=NULL;
L->len--;
}
linksock q=L;
while(q->next)
{
q=q->next;
sendto(usfd,buf,sizeof(buf),0,(struct sockaddr*)&q->cin,sizeodcin);
//printf("%s\n",buf);
}
}
close(usfd);
return 0;
}
头文件集
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/ipc.h>
#include<wait.h>
#include<fcntl.h>
#include<unistd.h>
#include<time.h>
#include<dirent.h>
#include<pthread.h>
#include<stdlib.h>
#include<sys/sem.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<unistd.h>
#define SERVER_PORT 8800
#define SERVER_IP "192.168.8.101"
#define IP_ADDR "192.168.8.102"
#define PORT 5201
#define NUM 10
#define ERR_MSG(msg) do{\
printf("line=%d\n",__LINE__);\
perror(msg);\
}while(0)
#endif