linux下用c语言编写局域网聊天工具

linux下用c语言编写局域网聊天工具,第1张

/*服务器*/

#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

}

1、TOP 1 imo内网通内网通是一款完全免费局域网沟通软件。 快捷方便是软件的最大特点,自动扫描在线飞鸽用户,即刻实现客户端文件互传、远程播放和打印功能,成为企业、政府办公和家庭多媒体共享的有力工具。而且基于内网,安全、可控。它将聊天信息全部留在用户本机,不经过互联网和服务器,不受监控,并对聊天信息通过AES技术进行加密,从源头上保证了用户的信息安全。完全兼容网上广为流传的飞秋、飞鸽传书。并比原来飞鸽功能更加强大.2、TOP 2 飞秋飞秋(FeiQ)是一款局域网聊软件,它参考了飞鸽传书(IPMSG)和QQ, 完全兼容飞鸽传书(IPMSG)协议,具有局域网传送方便,速度快, *** 作简单的优点,同时具有QQ中的一些功能,是飞鸽的完善代替者。遗憾的是,由于互联网的快速发展,人们的眼光早已从局域网转向了更加广阔的全球化互联网领域。大量的软件开发人员都投身到了互联网浪潮之中,局域网渐渐被一些开发人员所忽略。飞秋宣布停止更新后、市场上仅仅剩下imo内网通等为数不多几家仍然坚持提供局域网沟通服务。3、TOP 3 飞鸽传书飞鸽传书是一款局域网内部聊天、文件传输工具, 在程序结构方面采用了Windows SDK处理结构,通信方面采用了TCP/UDP通信方式,在文件传输处理方面采用文件映射技术,等等。通过分析IP Messenger的运行、工作原理,可以提高并加深对Windows处理流程的理解,提高SOCKET编程技术等,因此特对其源码进行分析,以抛砖引玉,共同提高大家的编程技术。缺点是界面 *** 作太复杂,易用性不强。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8468642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存