《Linux系统编程实验七网络编程》由会员分享,可在线阅读,更多相关《Linux系统编程实验七网络编程(11页珍藏版)》请在金锄头文库上搜索。
1、实验七:网络编程l 实验目的:学会Linux的socket套接字网络编程,熟悉使用TCP传输协议的网络编程流程l 实验要求:编写使用TCP协议的服务器程序和客户端程序,客户端向服务器发送字符串,服务器打印收到的字符串l 实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台l 实验步骤:1、编写服务器端代码tcp_server.c#include #include #include #include #include #include #include #include #define portnumber 3333int main(int argc, char *argv) i
2、nt sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size; int nbytes;char buffer1024;/*1、服务器创建sockfd描述符 */ if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)/ AF_INET:IPV4;SOCK_STREAM:TCP fprintf(stderr,Socket error:%sna,strerror(errno); exit(1); /* 2、服务器端填充 sockaddr结构
3、 */ bzero(&server_addr,sizeof(struct sockaddr_in); / 初始化,置0server_addr.sin_family=AF_INET; / Internetserver_addr.sin_addr.s_addr=htonl(INADDR_ANY); / (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上/server_addr.sin_addr.s_addr=inet_addr(192.168.1.1); /用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ipserver_addr.s
4、in_port=htons(portnumber); / (将本机器上的short数据转化为网络上的short数据)端口号/* 3、绑定地址结构体 */ if( bind(sockfd, &server_addr,sizeof(server_addr)0)printf(“bind error!”);exit(-1);/* 4、设置监听允许连接的最大客户端数 */ if( listen( sockfd, 0)0)printf(“listen error!”);exit(-1);while(1) /* 5、服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(struct soc
5、kaddr_in); if(new_fd=accept(sockfd,& server_addr,&sin_size)0)printf(“accept error!”);exit(-1); /连接成功后打印客户端IPfprintf(stderr,Server get connection from %sn,inet_ntoa(client_addr.sin_addr); / 将网络地址转换成.字符串 /6、read()函数读取客户端发送的消息nbytes=read(new_fd,buffer,1024);buffernbytes=0;printf(Server received %sn,buf
6、fer);/* 这个通讯已经结束 */ close(new_fd); /* 循环下一个 */ /* 结束通讯 */ close(sockfd); exit(0); /*完整程序*#include #include #include #include #include #include #include #include #include/inet_ntoa()#include /read(),close()#define portnumber 3333int main(int argc, char *argv) int sockfd,new_fd; struct sockaddr_in ser
7、ver_addr; struct sockaddr_in client_addr; int sin_size; int nbytes;char buffer1024;/*1、服务器创建sockfd描述符 */ if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,Socket error:%sna,strerror(errno); exit(1); /* 2、服务器端填充 sockaddr结构 */ bzero(&server_addr,sizeof(struct sockaddr_in); server_addr.sin_fam
8、ily=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(portnumber); /* 3、绑定地址结构体 */ if( bind(sockfd, (struct sockaddr *)(&server_addr),sizeof(struct sockaddr)0)printf(bind error!);exit(-1);/* 4、设置监听允许连接的最大客户端数 */ if( listen( sockfd,5)0)printf(listen error!);exit(-1);wh
9、ile(1) /* 5、服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(struct sockaddr_in); if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)0)printf(accept error!);exit(-1); /连接成功后打印客户端IP if(fork=0) /fork(),创建子进程,多个进程不需等候fprintf(stderr,server get connection from %sn,inet_ntoa(client_addr.sin_addr); /6、
10、read()函数读取客户端发送的消息nbytes=read(new_fd,buffer,1024);buffernbytes=0;printf(Server received %sn,buffer);/* 这个通讯已经结束 */ close(new_fd); else close(new_fd); /结束父进程/* 循环下一个 */ /* 结束通讯 */ return 0; */2、编写客户端代码tcp_client.c#include #include #include #include #include #include #include #include #define portnumb
11、er 3333int main(int argc, char *argv) int sockfd; char buffer1024; struct sockaddr_in server_addr; struct hostent *host; /* 1、客户程序开始建立 sockfd描述符 */ if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) /AF_INET:Internet;SOCK_STREAM:TCP fprintf(stderr,Socket Error:%san,strerror(errno); exit(1); /* 2、客户程序填充服务端的
12、资料 */ bzero(&server_addr,sizeof(server_addr); / 初始化,置0server_addr.sin_family=AF_INET; / IPV4server_addr.sin_port=htons(portnumber); / (将本机器上的short数据转化为网络上的short数据)端口号server_addr.sin_addr.s_addr=htonl(INADDR_ANY);/* 3、connect函数,客户程序发起连接请求 */ if( connect( sockfd, &server_addr, sizeof(server_addr)0)printf(“connet error!”);exit(-1);z/* 连接成功了 */ printf(Please input char:n);/* 等待终端输入数据 */fgets(buffer,1024,stdin); /4、write函数发送buffer数据write( sockfd,buffer,strlen(buffer);/* 结束通讯 */ close(sockfd); exit(0); /*