Linux环境 创建TCP协议实现服务端和客户端聊天

 服务端代码:

#include <stdio.h>   //包含tcp通讯所需系统头文件
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include<stdlib.h>


int main(int argc,char* argv[])   //  程序运行时,输入连接目标的地址和端口号

{
   int s_fd;             //创建服务端套接字句柄
   struct sockaddr_in s_addr;    //创建服务端socket结构体
   struct sockaddr_in c_addr;    //创建客户端socket结构体

   int n_read; 
   int c_len;
   int c_fd;
   
   
   
   char msg[128]={0};     //创建消息数组(发送) 
   char readBuf[128]={0};;   //创建消息数组(读取) 

            /*1.socket
              2.bind
              3.listen
              4.accept
              5.read
              6.write    */
               

    s_fd = socket(AF_INET,SOCK_STREAM,0);  //创建服务器套接字

    s_addr.sin_family = AF_INET;      //配置socket结构体参数
    s_addr.sin_port = htons(atoi(argv[2]));     //输入需要连接的端口号
    inet_aton(argv[1],&s_addr.sin_addr);   //输入连接到的IP地址


    bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in)); //捆绑socket和ip地址

    listen(s_fd,20);   //监听,服务端阻塞,等待客户端接入
    
  while(1)  //  (父进程)不断接受客户端接入
 {

      
     c_len = sizeof( struct sockaddr_in);  
     c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&c_len);  //接收成功

      if(c_fd == -1)
        {
           perror("accept error");
        }
    
       printf("connect success : %s\n", inet_ntoa(c_addr.sin_addr) );
    
    
    
    if(fork()==0)   //创建子进程
    {
       
       if(fork()==0)  //发送子进程
       {
        while(1)
        {
         memset(msg,0,sizeof(msg));    //清空发送数组的数据
         printf("please input :  \n");
         gets(msg);                    //输入发送的消息到数组
         write(c_fd,msg,strlen(msg));   //向客户端写入消息
	}
     
         
       }
       
       
       while(1)    //读取子进程
       {
         memset(readBuf,0,sizeof(readBuf));   //清空读取数组的消息
         n_read = read(c_fd,readBuf,128);    //从客户端读取消息到readBuf
      
          if(n_read == -1)
            {
               perror("read error");       
            }
          else
             {
               printf("get message %d , %s\n",n_read,readBuf);   /显示读取到的消息
             }
         
       }   
      //break;
    }
 }
    
    
    


   return 0;
}

运行:./a.out  ip地址    端口号 

客户端代码:


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char* argv[])   //运行时输入接入的IP地址和端口号


{
   int c_fd;
   
   int n_read;
   
   struct sockaddr_in c_addr;

   char ReadBuf[128]={0};   //初始化读取数组
    
   char XieBuf[128]={0};    //初始化写入数组

            /*1.socket
              2.connect          
              3.write
              4.read    */
               

    c_fd = socket(AF_INET,SOCK_STREAM,0);  //创建客户端套接字句柄

    c_addr.sin_family = AF_INET;      
    c_addr.sin_port = htons(atoi(argv[2]));   //输入端口号
    inet_aton(argv[1],&c_addr.sin_addr);      //输入ip地址

  int coreturn=connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)); //连接
  
    if(coreturn == -1)
      {
        perror("connect");
        exit(-1);
      
      }
   
  while(1)  //连接完毕进入循环聊天
  {



      if(fork()==0)  //子进程,用于发送
      {
        while(1)
        {
         memset(XieBuf,0,sizeof(XieBuf));   //清空消息数组
         printf("please input: \n");
         gets(XieBuf);     //输入发送消息
         write(c_fd,XieBuf,strlen(XieBuf));   //向服务端输入消息
        }
      }
      
      while(1)  //父进程,用于读取
      {
        memset(ReadBuf,0,sizeof(ReadBuf));  //清空消息数组
        n_read = read(c_fd,ReadBuf,128);    //将读取到的消息存入数组

        if(n_read == -1)
          {
             perror("read");
             exit(-1);
          }
         else{
                 printf("get message %d,%s \n",n_read,ReadBuf);
             }
        
      
      }
      
   }
    


   return 0;
}

运行: ./a.out  ip地址    端口号 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值