tcp_server.c服务模型

本文介绍了一个简单的TCP服务器的实现过程,包括创建socket、绑定端口、监听连接请求、接受客户端连接及读取客户端发送的数据等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <errno.h>  
  4. #include <string.h>  
  5. #include <netdb.h>  
  6. #include <sys/types.h>  
  7. #include <netinet/in.h>  
  8. #include <sys/socket.h>  
  9.   
  10. #define portnumber 3333  
  11.   
  12. int main(int argc ,char *argv[])  
  13. {  
  14.         int sockfd,new_fd;  
  15.         struct sockaddr_in server_addr;  
  16.         struct sockaddr_in client_addr;  
  17.         int sin_size;  
  18.         int nbytes;  
  19.         char buffer[1024];  
  20.           
  21.         /*服务器端开始建立sockfd描述符*/  
  22.         if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){  
  23.                 fprintf(stderr,"Socket error:%s\n\a",strerror(errno));    
  24.                 exit(1);  
  25.         }  
  26.           
  27.         /*服务器端填充sockaddr结构*/  
  28.         bzero(&server_addr,sizeof(struct sockaddr_in)); //初始化,置0  
  29.         server_addr.sin_family=AF_INET;   //internet  
  30.         server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//将本机上的long数据转化为网络上的long数据  
  31.         //server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");//用于绑定一个固定ip.inet_addr  
  32.         server_addr.sin_port=htons(portnumber);//将本机上的short数据转化为网络上的short数据  
  33.           
  34.         /*捆绑sockfd描述符到ip地址*/  
  35.         if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)  
  36.         {  
  37.                 fprintf(stderr,"Bind error:%s\n\a",strerror(errno));  
  38.                 exit(1);      
  39.         }  
  40.           
  41.         /*设置允许连接的最大客户端数*/  
  42.         if(listen(sockfd,5)==-1)  
  43.         {  
  44.                 fprintf(stderr,"Listen errr:%s\n\a",strerror(errno));  
  45.                 exit(1);  
  46.         }  
  47.           
  48.         while(1)  
  49.         {  
  50.                 /*服务器阻塞,直到有客户程序建立连接*/  
  51.                 sin_size=sizeof(struct sockaddr_in);  
  52.                 if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)  
  53.                 {  
  54.                         fprintf(stderr,"Accept error:%s\n\a",strerror(errno));  
  55.             exit(1);  
  56.                 }     
  57.                   
  58.                 fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));  
  59.                   
  60.                 if((nbytes=read(new_fd,buffer,1024))==-1)  
  61.                 {  
  62.                     fprintf(stderr,"Read Error:%s\n",strerror(errno));    
  63.                     exit(1);  
  64.                 }  
  65.                 buffer[nbytes]='\0';  
  66.                 printf("Server received %s\n",buffer);  
  67.                   
  68.                 /*这个通讯已经结束*/  
  69.                 close(new_fd);  
  70.                 /*循环下一个*/  
  71.         }  
  72.         /*结束通讯*/  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值