客户端
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<linux/input.h>
#define IP "192.168.2.157"
#define PORT 8888
#define ERR_MSG(msg) do{\
fprintf(stderr,"line:%d:%s %s\n",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0)
typedef struct msg{
char type;
char name[20];
char text[128];
}msg_t;
/*void handler(int sig)
{
while(waitpid(-1,NULL,WNOHANG)>0);
}*/
int main(int argc, const char *argv[])
{
/* if(signal(SIGCHLD,handler)==SIG_ERR)
{
ERR_MSG("signal");
return -1;
}
*/
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速重用\n");
//服务器的地址信息结构体
struct sockaddr_in sin;
sin.sin_family =AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
socklen_t sinlen=sizeof(sin);
msg_t msg1;
char news[148]="";
//登录
printf("输入L+用户名:");
scanf(" %c %s",&msg1.type,msg1.name);
pid_t pid=fork();
if(pid<0)
{
ERR_MSG("fork");
return -1;
}
else if(0==pid)
{
printf("C or Q");
scanf(" %c",&msg1.type);
if(msg1.type=='q'|msg1.type=='Q')
{
printf("已下线\n");
close(sfd);
return 0;
}
else if(msg1.type=='c'|msg1.type=='C')
{
while(1)
{
bzero(news,sizeof(news));
printf("发送:");
scanf("%s",msg1.text);
if(strcmp(msg1.text,"quit")==0)
{
printf("已下线\n");
close(sfd);
return 0;
}
strcat(news,msg1.name);
strcat(news," : ");
strcat(news,msg1.text);
if(sendto(sfd,news,sizeof(news),0,(struct sockaddr*)&sin,sinlen)<0)
{
ERR_MSG("sendto");
return -1;
}
printf("发送成功\n");
}
}
}
else//父进程
{
while(1)
{
bzero(news,sizeof(news));
if(recvfrom(sfd,news,sizeof(news),0,(struct sockaddr*)&sin,&sinlen)<0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("%s\n",news);
}
}
return 0;
}