多进程并发服务器

本实验基于Linux平台下的C语言编程实现

1.服务器端程序设计步骤:

   1)使用socket()函数创建套接字;

   2)将创建的套接字绑定到指定的地址结构;

   3)listen()函数设置套接字为侦听模式,使服务器处于打开状态;

   4)接受客户端的连接请求,建立连接;

   5)接收、应答客户端的数据请求;

   6)终止连接。

2. 客户端程序设计步骤:

   1)使用socket()函数创建套接字;

   2)调用connect()函数建立一个与TCP服务器的连接;

   3)发送数据请求,接收服务器的数据应答;

   6)终止连接。

代码:

//客户端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define MAXDATASIZE 1000 #define PORT 1234 int main(int argc,char **argv){ int listenfd,nbytes; struct sockaddr_in srvaddr; char buf[MAXDATASIZE]; int i=1; //使用socket()函数创建套接字 listenfd=socket(AF_INET,SOCK_STREAM,0); //listenfd侦听套接字,SOCK_STREAM流式套接字 if(listenfd==-1){ printf("create socket failed !\n"); exit(1); } //指定服务器地址(本地socket地址采用默认值) bzero(&srvaddr,sizeof(srvaddr)); //初始化 srvaddr.sin_family=AF_INET; //IPv4 srvaddr.sin_port=htons(PORT); //htons:host to net long //将字符串形式的IP地址转换成32网络字节序的IP地址 if(inet_aton("127.0.0.1",srvaddr.sin_addr.s_addr)==-1){ printf("addr convert error !\n"); exit(1); } //调用connect()函数建立一个与TCP服务器的连接 if(connect(listenfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1){ printf("connect error !\n"); exit(1); } //接收服务器的数据应答 //recv()函数前三个参数与read()函数一致,第四个参数为0时与read()相同 if((nbytes=recv(listenfd,buf,MAXDATASIZE,0))==-1){ printf("read error !\n"); exit(1); } buf[nbytes]='\0'; printf("Server Massage: %s\n",buf); printf("Input your name: "); //提示输入客户姓名,用来区分不同的客户 scanf("%s",buf); if((nbytes=send(listenfd,buf,strlen(buf),0))==-1){ perror("Send error !\n"); exit(1); } while(i){ printf("Input message(max char:%d):",MAXDATASIZE);//输入要发给server的消息 scanf("%s",buf); if(strlen(buf)<1) i=0; if((nbytes=send(listenfd,buf,strlen(buf),0))==-1){//发送消息 perror("Send error !\n"); exit(1); } if((nbytes=recv(listenfd,buf,MAXDATASIZE,0))==-1){//接收server的反馈消息 perror("read error !\n"); exit(1); } buf[nbytes]='\0'; printf("Server message: %s\n",buf); printf("\n"); } //关闭listenfd close(listenfd); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxpsd.html