Linux 控制台聊天程序

//客户端代码 

#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;
}   


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值