您的位置:首页 > 运维架构 > Linux

Linux 控制台聊天程序

2014-03-11 08:48 309 查看
//客户端代码

#include<stdio.h>

#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<resolv.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define MAXBUF 1024

int main(int argc, char** argv)
{
int sockfd,len;
struct sockaddr_in dest;
char buffer[MAXBUF+1];
if(argc!=3)
{
printf("(Fail)");
exit(0);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) //create socket
{
perror("(Socket)");
exit(errno);
}
printf("(socket created)\n");
bzero(&dest,sizeof(dest)); //clear dest
dest.sin_family=AF_INET;
dest.sin_port=htons(atoi(argv[2]));
if(inet_aton(argv[1],(struct in_addr*)&dest.sin_addr.s_addr)==0)
{
perror(argv[1]);
exit(errno);
}
printf("(address created)\n");
if(connect(sockfd,(struct sockaddr_in*)&dest,sizeof(dest))!=0)
{
perror("(Connect)");
exit(errno);
}
printf("(server connected)\n");
printf("(server sents first, both send in turn)\n");
while(1)
{
bzero(buffer,MAXBUF+1);
len=recv(sockfd,buffer,MAXBUF,0);
if(len>0)
printf("server:%s\n",buffer,len);
else
{
if(len<0)
printf("(Fail)\n");
else
printf("(Quit)\n");
break;
}
bzero(buffer,MAXBUF+1);
fgets(buffer,MAXBUF,stdin);
if(!strncasecmp(buffer,"quit",4))
{
printf("(Quit)\n");
break;
}
len=send(sockfd,buffer,strlen(buffer)-1,0);
if(len<0)
{
printf("(Fail)\n");
break;
}
}
close(sockfd);
return 0;
}

/***********************************************************************************************************************************************************************/

//服务器代码

#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>
#include<unistd.h>
#include<arpa/inet.h>
#define MAXBUF 1024

int main(int argc, char** argv)
{
int sockfd, new_fd;
socklen_t len;
struct sockaddr_in my_addr, their_addr;
unsigned int myport, lisnum;
char buf[MAXBUF+1];
if(argv[1])
myport=atoi(argv[1]); //atoi converts string to int
else
myport=7838;
if(argv[2])
lisnum=atoi(argv[2]);
else
lisnum=2;
if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1) //create socket
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in)); //clear my_addr to zero
my_addr.sin_family=PF_INET;
my_addr.sin_port=htons(myport); //converts the type order
if(argv[3])
my_addr.sin_addr.s_addr=inet_addr(argv[3]); //inet_addr converts IP address to int
else
my_addr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockfd,(const struct sockaddr_in*)&my_addr,sizeof(struct sockaddr_in))==-1) //bind
{
perror("bind");
exit(1);
}
if (listen(sockfd,lisnum)==-1) //listen
{
perror("listen");
exit(1);
}
while(1)
{
printf("\n(----Server start....)\n");
printf("(server sents first, both send in turn)\n");
len=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr_in*)&their_addr,&len))==-1) //accept
{
perror("accept");
exit(errno);
}
else
printf("(server: got connection from %s, port %d, socket %d)\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port),new_fd);
while(1)
{
bzero(buf,MAXBUF+1); //clear buffer
fgets(buf,MAXBUF,stdin);
if(!strncasecmp(buf,"quit",4)) //if received "quit", then quit
{
printf("\n(Quit!)\n");
break;
}
len=send(new_fd,buf,strlen(buf)-1,0); //send messages to the other socket
if(len<0)
{
printf("(Fail)\n");
break;
}
bzero(buf,MAXBUF+1); //clear buffer
len=recv(new_fd,buf,MAXBUF,0);
if(len>0)
printf("client:%s\n",buf);
else
{
if(len<0)
printf("(Fail)");
else
printf("(Quit)\n");
break;
}
}
close(new_fd);
}
close(sockfd);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: