Linux基于TCP/IP简单的客户端、服务器通信程序实例

服务器端代码:

#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>
#include<fcntl.h>   
 
int main (int argc, char * argv[])  
{  
    //创建套接字,即创建socket   
    int server_sockfd, client_sockfd;
    unsigned  int myport;
    socklen_t len;
    struct sockaddr_in server_addr, client_addr;
    char buf[1024];  
    //绑定信息,即命名socket    
    server_addr.sin_family = AF_INET;   
    server_addr.sin_port = htons(myport);
        
        if (argc !=3 )
    {
        printf("Please Input %s  IP Port\n",argv[0]);
        exit(EXIT_FAILURE);    
    }
    //inet_addr函数将用点分十进制字符串表示的IPv4地址转化为用网络字节序整数表示的IPv4地址
    if(argv[1])
        server_addr.sin_addr.s_addr = inet_addr(argv[1]);
    else
        server_addr.sin_addr.s_addr = INADDR_ANY;
    if(argv[2])
        myport = atoi(argv[2]);
    else
        myport = 7575;
 
    //创建socket
    if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)  
    {        
         perror("socket");  
         return 1;  
    }  
 
     //绑定
    if(bind(server_sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)   
    {                           
        perror("bind");   
        return 2;         
    }   
 
        //监听socket   
    if(listen(server_sockfd, 5) < 0)  
    {    
        perror("listen");  
        return 3;  
    }  
 
        
      //int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen)  
      //sockfd参数是执行过listen系统调用的监听socket;addr参数用来获取被  
      //接受连接的远端socket地址,该socket地址的长度由addrlen参数指出  
      //accept成功时返回一个新的连接socket,该socket唯一的标识了被接受  
      //的这个连接,服务器可通过读写该socket来与被接受连接对应的客户端通信    
 
      len = sizeof(struct sockaddr);
      client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, (socklen_t *)&len);  
 
      if(client_sockfd < 0)  
      {  
          perror("accept");  
          return 4;  
      }  
      else  
      {  
          printf("connected with IP: %s  and port: %d\n", inet_ntop(AF_INET,&client_addr.sin_addr, buf, 1024), ntohs(client_addr.sin_port));  
          
      }  
    printf("Waiting client connecting……");
      while(1)  
      {  
          memset(buf, '\0', sizeof(buf));  
          ssize_t size = read(client_sockfd, buf, sizeof(buf) - 1);  
 
          if(size > 0)  
          {  
              printf("client#: %s\n", buf);  
          }  
          else if(size == 0)  
          {  
              printf("read is done...\n");  
              break;  
          }  
          else   
          {  
              perror("read");  
              break;  
          }  

          printf("server please enter: ");  
          fflush(stdout);  //刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
          size = read(0, buf, sizeof(buf) - 1);  
          if(size > 0)  
          {  
              buf[size - 1] = '\0';  
          }  
          else if(size == 0)  
          {  
              printf("read is done...\n");  
              break;  
          }  
          else  
          {  
              perror("read");  
              break;  
          }     
          write(client_sockfd, buf, strlen(buf));  
      }  
        close(server_sockfd);  
      return 0;  


客户端代码:

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

int main (int argc, char * argv[])  
{  
    unsigned int myport;
    int client_sockfd;
      //创建套接字,即创建socket   

        if (argc !=3 )
    {
        printf("Please Input %s  IP Port\n",argv[1]);
        exit(EXIT_FAILURE);    
    }

       client_sockfd = socket(AF_INET, SOCK_STREAM, 0);   
      if(client_sockfd < 0)  
      {  
          perror("socket");  
          return 1;  
      }  
 
      //绑定信息,即命名socket   
      struct sockaddr_in addr;   
      addr.sin_family = AF_INET;   
      addr.sin_port = htons(atoi(argv[2]));   
      //inet_addr函数将用点分十进制字符串表示的IPv4地址转化为用网络   
      //字节序整数表示的IPv4地址   
      addr.sin_addr.s_addr = inet_addr(argv[1]);   
 
      //不需要监听  
 
      //发起连接  
//    struct sockaddr_in peer;  
      socklen_t addr_len = sizeof(addr);  
      int connect_fd = connect(client_sockfd, (struct sockaddr*)&addr, addr_len);  
      if(connect_fd < 0)  
      {  
          perror("connect");  
          return 2;  
      }  
      char buf[1024];  
 
      while(1)  
      {  
          memset(buf, '\0', sizeof(buf));  
          printf("client please enter: ");  
          fflush(stdout);  
          ssize_t size = read(0, buf, sizeof(buf) - 1);  
          if(size > 0)  
          {  
              buf[size - 1] = '\0';  
          }  
          else if(size == 0)  
          {  
              printf("read is done...\n");  
              break;  
          }  
          else  
          {  
              perror("read");  
              return 4;  
          }  
         // printf("client: %s\n", buf);  
          write(client_sockfd, buf, strlen(buf));  
          size = read(client_sockfd, buf, sizeof(buf));  
          if(size > 0)  
          {  
              buf[size] = '\0';  
          }  
          else if(size == 0)  
          {  
              printf("read is done...\n");  
              break;  
          }  
          else   
          {  
              perror("read");  
              return 5;  
          }  
          printf("server: %s\n", buf);  
       }  
      close(client_sockfd);  
      return 0;  


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值