一个TCP/IP通信的实例
2016-02-12 15:51
651 查看
/*服务器端*/ #include<stdlib.h> #include<stdio.h> #include<string.h> #include<errno.h> #include<netdb.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<unistd.h> #include<arpa/inet.h>//不加这一句的话,inet_ntoa的函数会警告 #define MAXSIZE 1024 int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char buf[MAXSIZE]; if(argc!=2) { fprintf(stderr,"Usage :%s portnumber\a\n",argv[0]); exit(1); } if((portnumber=atoi(argv[1]))<0) { fprintf(stderr,"Usage :%s protnumber\a\n",argv[0]); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); } bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); } if(listen(sockfd,5)==-1) { fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); exit(1); } while(1) { sin_size=sizeof(struct sockaddr_in); 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)); printf("Connect successful,please input the message [<1024 bytes]:\n"); if(fgets(buf,sizeof(buf),stdin)!=buf) { printf("fgets error!\n"); exit(1); } if(write(new_fd,buf,strlen(buf))==-1) { fprintf(stderr,"Write error!\n",strerror(errno)); exit(1); } close(new_fd); } close(sockfd); exit(0); }
/*客户端*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<netdb.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> int main(int argc, char *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; if(argc!=3) { fprintf(stderr,"Usage:%s hostname portnumber\a\n0",argv[0]); exit(1); } if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,"Gethostname error\n"); exit(1); } if((portnumber=atoi(argv[2]))<0) { fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]); exit(1); } while(1) { if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket Error:%s\a\n",strerror(errno)); exit(1); } bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr);
/* 注意这个 connect 函数 #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd,struct sockaddr *serv_addr,int addrlen); 第二个参数 指向结构体的指针 由于host定义是struct hostent *host struct hostent { char *h_name; char *h_aliases; int h_addrtype; int h_length; char **h_addr_list;//主机的ip地址列表 } #define h_addr h_addr_list[0]; 这里的server_addr.sin_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((nbytes=read(sockfd,buffer,1024))==-1) { fprintf(stderr,"Read Error:%s\a\n",strerror(errno)); exit(1); } buffer[nbytes]='\0'; printf("I have received:%s",buffer); close(sockfd); } exit(0); }
程序的执行
gcc -o server_tcp server_tcp.c gcc -o client_tcp client_tcp.c 在第一个shell端 ./server_tcp 5678 在第二个shell端 ./client_tcp localhost 5678
程序的执行结果
shell 1 Server get connection from 1995400920: Connect successful,please input the message [<1024 bytes]: jljgjglk shell 2 I have received:jljgjglk
相关文章推荐
- 多线程版本httpClient4文章地址记录
- 那些被吹的神乎其乎的QQ营销大法
- iOS开发网络篇—搭建本地服务器(待整理)
- html5 网络状态
- 【slighttpd】基于lighttpd架构的Server项目实战(11)—C++的Name Mangling
- 【slighttpd】基于lighttpd架构的Server项目实战(10)—插件&动态库
- 网络层提供的两种服务——虚电路服务和数据报服务
- 什么是神经网络或者微粒群算法所说的陷入 局部极小值?局部极小值是什么?
- bzoj:1834: [ZJOI2010]network 网络扩容
- MirrorNetwork 基于jmdns和netty的android网络通信开源库
- Alex-Word-Filter-MFC网络版java客户端发布
- TCP流量控制
- TCP状态转换
- http VS https
- 从贝叶斯方法谈到贝叶斯网络
- 解决win10下WIFI无法连接到网络
- TCP/IP协议模型详解
- 深度学习与计算机视觉系列(10)_细说卷积神经网络
- VirtualBox虚拟机网络环境解析和搭建-NAT、桥接、Host-Only、Internal、端口映射
- Linux网络编程 -- 网络模型与通信过程