Linux网络编程之TCP协议-阿里云开发者社区

开发者社区> linux_drv> 正文

Linux网络编程之TCP协议

简介:
+关注继续查看

server.c:


#include <stdlib.h> 

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 


#define portnumber 8888


int main(int argc, char *argv[]) 

int sockfd,new_fd; 
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_addr; 
struct sockaddr_in client_addr; 
int sin_size; 
char hello[]="Hello! Are You Fine?\n"; 
char buff[1024];
int nbytes;



/* 服务器端开始建立sockfd描述符 */ 
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP 创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); 
exit(1); 



/* 服务器端填充 sockaddr结构 */ 
bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0 把一段内存区的内容全部设置为0
server_addr.sin_family=AF_INET;                 // Internet
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  // (将本机器上的long数据转化为网络上的long数据)和任何主机通信  //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP
//server_addr.sin_addr.s_addr=inet_addr("210.41.141.155");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
server_addr.sin_port=htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

/* 捆绑sockfd描述符到IP地址 把socket和socket地址结构联系起来*/ 
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) 

fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); 
exit(1); 



/* 设置允许连接的最大客户端数 server_socket用于监听*/ 
if(listen(sockfd,5)==-1) 

fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); 
exit(1); 



while(1) 

/* 服务器阻塞,直到客户程序建立连接 */ 
sin_size=sizeof(struct sockaddr_in); 
//接受一个到server_socket代表的socket的一个连接
        //如果没有连接请求,就等待到有连接请求--这是accept函数的特性
        //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
        //new_server_socket代表了服务器和客户端之间的一个通信通道
        //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) 

fprintf(stderr,"Accept error:%s\n\a",strerror(errno)); 
exit(1); 

fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串

if((nbytes=read(new_fd,buff,1024))==-1) 

fprintf(stderr,"Write Error:%s\n",strerror(errno)); 
exit(1); 

/* 这个通讯已经结束 */ 
printf("Server received %s\n",buff);
close(new_fd); 
/* 循环下一个 */ 



/* 结束通讯 */ 
close(sockfd); 
exit(0); 


client.c:

#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 


#define portnumber 8888


int main(int argc, char *argv[]) 

int sockfd; 
char buffer[1024]; 
struct sockaddr_in server_addr; //设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct hostent *host; 
int nbytes; 
char buff[1024];


        /* 使用hostname查询host 名字 */
if(argc!=2) 

fprintf(stderr,"Usage:%s hostname \a\n",argv[0]); 
exit(1); 



if((host=gethostbyname(argv[1]))==NULL) 

fprintf(stderr,"Gethostname error\n"); 
exit(1); 



/* 客户程序开始建立 sockfd描述符 */ 
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP

fprintf(stderr,"Socket Error:%s\a\n",strerror(errno)); 
exit(1); 



/* 客户程序填充服务端的资料 */ 
bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET;          //  //internet协议族
server_addr.sin_port=htons(portnumber);  // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址

/* 客户程序发起连接请求 */ 
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) 

fprintf(stderr,"Connect Error:%s\a\n",strerror(errno)); 
exit(1); 



/* 连接成功了 */ 
#if 0
if((nbytes=read(sockfd,buffer,1024))==-1) 

fprintf(stderr,"Read Error:%s\n",strerror(errno)); 
exit(1); 

#endif

//buffer[nbytes]='\0'; 
//printf("I have received:%s\n",buffer); 
  printf("please input  char :\n ");
fgets(buff,1024,stdin);
write(sockfd,buff,strlen(buff));
/* 结束通讯 */ 
close(sockfd); 
exit(0); 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
冬季训练营-从0到1玩转云服务器学习报告记录
从0到1玩转云服务器学习报告记录,搭建云上博客全过程
15 0
上云第一课第一期部署MySQL数据库
主要讲述数据的部署以及使用
7 0
第一期学习报告(Yasso_c)
第一期学习报告(Yasso_c)
16 0
第一期体验印象最深的地方
第一期体验印象最深的地方
17 0
阿里云天池大赛赛题解析——机器学习篇-赛题一(7)
阿里云是国内知名的云计算、大数据、人工智能技术型公司,是阿里巴巴集团最重要的技术部门。阿里云天池是阿里云面向开发者和教育行业的资源输出部门,天池大赛是国内最大规模的人工智能算法赛事,致力于汇聚全球AI精英为企业解决真实问题。自2014年至今已举办数十次行业顶级算法赛事,全球参赛开发者超过30万人。然而对于更广大的普通开发者和大学生群体来说,高规格的算法大赛仍然具有很高的门槛。本书就是针对受众最广泛的新手人群而编写的,精选阿里巴巴最典型的人工智能算法应用案例,邀请天池大赛最顶级的获奖选手联合编撰,公开那些鲜为人知的技术秘籍,力图使每一个涉足数据智能算法技术的开发者从中获益......
9 0
飞天加速计划使用体验
对于云服务器的使用体验感受
11 0
学习报告 冬季实战营第一期:从零到一上手玩转云服务器
冬季实战营第一期:从零到一上手玩转云服务器-本期学习报告
8 0
Linux安装MySQL时注意事项
主要针对遇到的异常进行记录,后续遇到会继续填充
9 0
云起实验室学习报告之LAMP搭建
云起实验室学习报告之LAMP搭建
6 0
+关注
201
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载