C语言游戏服务端和客户端,C语言简单实现服务器和客户端之间交流

#include #include #include #include #include #include #include #include #include #include #include #define N 1024

typedef void (*sighandler_t)(int);

typedef struct sockaddr SA;

typedef struct node

{

char name[N];

struct sockaddr_in addr;

struct node *next;

}Socklist;

typedef struct

{

char type;

char name[N];

char text[N];

}MSG;

Socklist *creat_empty()

{

Socklist *head;

head = (Socklist

*)malloc(sizeof(Socklist));

head->next = NULL;

return head;

}

void creat_list(Socklist *head,struct sockaddr_in addr,char *name)

{

Socklist *temp;

temp = (Socklist

*)malloc(sizeof(Socklist));

name[strlen(name) - 1] = ' ';

sprintf(temp->name ,"%s",

name);

temp->addr = addr;

temp->next = head->next;

head->next = temp;

return ;

}

void send_login(int socketfd,Socklist *head,char *name)

{

int test = -1;

char buff[N] = {0};

Socklist *p = head->next;

name[strlen(name) - 1] = ' ';

sprintf(buff,"%s

%s",name,"上线");

while( p != NULL )

{

if( 0 != strcmp(p->name ,name )

)

{

test =

sendto(socketfd,buff,sizeof(buff),0,(SA *)&p->addr,sizeof(p->addr));

if ( -1 == test )

{

perror("send");

exit(-1);

}

}

p = p->next;

}

bzero(buff,N);

return ;

}

void send_begin(int socketfd,Socklist *head,char *name,char *text)

{

int test = -1;

char buff[N] = {0};

Socklist *p = head->next;

name[strlen(name) - 1] = ' ';

sprintf(buff,"%s说: %s",name,text);

while( p != NULL )

{

if( 0 != strcmp(p->name ,name )

)

{

test =

sendto(socketfd,buff,sizeof(buff),0,(SA *)&p->addr,sizeof(p->addr));

if ( -1 == test )

{

perror("send");

exit(-1);

}

}

p = p->next;

}

return ;

}

void send_quiet(int socketfd,Socklist *head,char *name)

{

int test = -1;

char buff[N] = {0};

Socklist *q = head->next;

Socklist *p = head->next;

name[strlen(name) - 1] = ' ';

sprintf(buff,"%s  %s",name,"下线");

while( p != NULL )

{

if( 0 != strcmp(p->name ,name )

)

{

test = sendto(socketfd,buff,sizeof(buff),0,(SA

*)&p->addr,sizeof(p->addr));

if ( -1 == test )

{

perror("send");

exit(-1);

}

}

else

{

q->next = p->next;

free(p);

p = q;

}

q = p;

p = p->next;

}

return ;

}

void send_everyone(int socketfd,Socklist *head,char *text)

{

int test = -1;

char buff[N] = {0};

Socklist *p = head->next;

sprintf(buff,"%s %s","系统通知:",text);

while( p != NULL )

{

test =

sendto(socketfd,buff,N,0,(SA *)&p->addr,sizeof(p->addr));

if ( -1 == test )

{

perror("send");

exit(-1);

}

p = p->next;

}

return ;

}

int main(int argc, const char *argv[])

{

MSG msg;

Socklist *p;

int flag = 0;

pid_t pid = -1;

int test = -1;

int socketfd;

int connectfd;

socklen_t legh;

char buff[N] = {0};

sighandler_t signo;

struct sockaddr_in

ser_addr,cli_addr;

if ( 3 != argc )

{

printf("please input %s

argv[1] argv[2] ",argv[0]);

return -1;

}

socketfd =

socket(PF_INET,SOCK_DGRAM,0);

if ( -1 == socketfd )

{

perror("socket");

return -1;

}

ser_addr.sin_family = PF_INET;

ser_addr.sin_port =

htons(atoi(argv[2]));

ser_addr.sin_addr.s_addr =

inet_addr(argv[1]);

test = bind(socketfd,(SA

*)&ser_addr,sizeof(ser_addr));

if ( -1 == test )

{

perror("bind");

return -1;

}

pid = fork();

if ( 0 == pid )

{

while(1)

{

fgets(msg.text,N,stdin);

msg.type = '#';

test =

sendto(socketfd,&msg,sizeof(msg),0,(SA

*)&ser_addr,sizeof(ser_addr));

if ( -1 == test )

{

perror("sendto");

return -1;

}

}

}

if ( 0 < pid )

{

legh = sizeof(cli_addr);

Socklist *tty =

creat_empty();

while(1)

{

test =

recvfrom(socketfd,&msg,sizeof(msg),0,(SA *)&cli_addr,&legh);

if ( -1 == test )

{

perror("recvfrom");

return -1;

}

if ( msg.type == 'L' )

{

creat_list(tty,cli_addr,msg.name);

send_login(socketfd,tty,msg.name);

}

if ( msg.type == 'B' )

send_begin(socketfd,tty,msg.name,msg.text);

if ( msg.type == 'Q' )

send_quiet(socketfd,tty,msg.name);

if ( msg.type == '#' )

{

send_everyone(socketfd,tty,msg.text);

}

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值