當前位置:編程學習大全網 - 源碼下載 - linux下用c語言編寫局域網聊天工具

linux下用c語言編寫局域網聊天工具

/*服務器*/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define SERVPORT 5555

#define BACKLOG 10

#define MAX(a,b) ((a)>(b)?(a):(b))

void str_echo(int);

void server()

{

int sockfd,client_fd;

struct sockaddr_in my_addr;

struct sockaddr_in remote_addr;

socklen_t sin_size;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))== -1)

{

perror("socket create error!");

exit(1);

}

my_addr.sin_family=AF_INET;

my_addr.sin_port=htons(SERVPORT);

my_addr.sin_addr.s_addr=INADDR_ANY;

bzero(&(my_addr.sin_zero),8);

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)

{

perror("bind error!");

exit(1);

}

if(listen(sockfd,BACKLOG)==-1)

{

perror("listen error!");

exit(1);

}

while(1)

{

sin_size=sizeof(struct sockaddr_in);

if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1)

{

perror("accept error!");

continue;

}

printf("received a connection from %s\n",inet_ntoa(remote_addr.sin_addr));

if(!fork())

{

close(sockfd);

str_echo(client_fd);

exit(0);

}

close(client_fd);

}

}

void str_echo(int sockfd)

{

int maxfd;

char sendbuf[1024]={0};

char recvbuf[1024]={0};

fd_set rfds;

while(1)

{

FD_SET(0,&rfds);

FD_SET(sockfd,&rfds);

maxfd=MAX(0,sockfd)+1;

select(maxfd,&rfds,NULL,NULL,NULL);

if(FD_ISSET(sockfd,&rfds))

{

bzero(recvbuf,1024);

recv(sockfd,recvbuf,1024,0);

printf("C:%s\n",recvbuf);

}

if(FD_ISSET(0,&rfds))

{

read(0,sendbuf,1024);

send(sockfd,sendbuf,strlen(sendbuf),0);

bzero(sendbuf,1024);

}

}

}

int main()

{

server();

return 0;

}

/*客戶端*/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define SERVPORT 5555

#define MAXSIZE 1024

#define MAX(a,b) ((a)>(b)?(a):(b))

void client(int argc,char **argv)

{

int sockfd,maxfd;

char sendbuf[MAXSIZE]={0};

char recvbuf[MAXSIZE]={0};

// struct hostent *host;

struct sockaddr_in serv_addr;

fd_set rfds;

/* if(argc<2)

{

fprintf(stderr,"Please enter the sserver's name!\n");

exit(1);

}

if((host=gethostbyname(argv[1]))==NULL)

{

herror("get host by name error!\n");

exit(1);

}

*/

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("socket creat error!\n");

exit(1);

}

serv_addr.sin_family=AF_INET;

serv_addr.sin_port=htons(SERVPORT);

// serv_addr.sin_addr=*((struct in_addr *)host->h_addr);

serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

bzero(&(serv_addr.sin_zero),8);

if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)

{

perror("connection error!\n");

exit(1);

}

FD_ZERO(&rfds);

while(1)

{

FD_SET(0,&rfds);

FD_SET(sockfd,&rfds);

maxfd=MAX(0,sockfd)+1;

select(maxfd,&rfds,NULL,NULL,NULL);

if(FD_ISSET(sockfd,&rfds))

{

bzero(recvbuf,MAXSIZE);

recv(sockfd,recvbuf,MAXSIZE,0);

printf("S:%s\n",recvbuf);

}

if(FD_ISSET(0,&rfds))

{

fgets(sendbuf,MAXSIZE,stdin);

send(sockfd,sendbuf,strlen(sendbuf),0);

bzero(sendbuf,MAXSIZE);

}

}

// close(sockfd);

}

int main(int argc,char **argv)

{

client(argc,argv);

return 0;

}

  • 上一篇:目前開發信息管理系統軟件主要會使用哪些開發工具
  • 下一篇:2-4人好玩的桌遊
  • copyright 2024編程學習大全網