前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个简单的Linux下Client/Server应答例子

一个简单的Linux下Client/Server应答例子

作者头像
阳光岛主
发布2019-02-19 17:52:20
1.2K0
发布2019-02-19 17:52:20
举报
文章被收录于专栏:米扑专栏米扑专栏

题目:Hello world 要求:案例程序基于TCP协议,由客户程序启动后向服务器程序发送“hello world”,服务器程序显示客户机IP地址、端口、以及发送的信息。服务器将收到的字符串发送给客户端,客户端显示验证。 使用方法:在linux下编译 $gcc -o client client.c $gcc -o server server.c 先运行server程序$./server 再运行client程序$./client xxx(你要访问服务器名---非IP)

程序: /* client.c */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> int main(int argc,char *argv[]) {  int sockfd,numbytes;  char buf[100];  char *msg="hello world";  struct hostent *he;  struct sockaddr_in their_addr;  int i = 0;  //将基本名字和地址转换,用户必须输入服务器的名字为参数  if(argc<2) {   printf("You should input IP or Name of the server!/n");   exit(1);  }  he = gethostbyname(argv[1]);  //建立一个TCP套接口  if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {  perror("socket");  exit(1);  }  //初始化结构体,连接到服务器的2323端口  their_addr.sin_family = AF_INET;  their_addr.sin_port = htons(2323);  their_addr.sin_addr = *((struct in_addr *)he->h_addr);  bzero(&(their_addr.sin_zero),8);  //和服务器建立连接,若连接建立失败则直接报错  if(connect(sockfd,(struct sockaddr *)&their_addr,  sizeof(struct sockaddr))==-1){  perror("connect");  exit(1);  }  //向服务器发送字符串msg  if(send(sockfd,msg,strlen(msg),0)==-1) {  perror("send");  exit(1);  }  //接受从服务器返回的信息  if((numbytes = recv(sockfd,buf,100,0))==-1) {  perror("recv");  exit(1);  }  buf[numbytes] = '/0';  printf("result:%s",buf);  close(sockfd);  return 0; } /* server.c */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h>

void showClientInf(struct sockaddr_in client_addr) {   printf("/nThe IP of client is:%s",inet_ntoa(client_addr.sin_addr));   printf("/nThe Port of client is:%d/n",ntohs(client_addr.sin_port)); }

int main() {  int sockfd,new_fd;  struct sockaddr_in my_addr;  struct sockaddr_in their_addr;  int sin_size;  char buff[100];  int numbytes;  //建立TCP套接口  if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {   perror("socket");   exit(1);  }  //初始化结构体,并绑定2323端口  my_addr.sin_family = AF_INET;  my_addr.sin_port = htons(2323);  my_addr.sin_addr.s_addr = INADDR_ANY;  bzero(&(my_addr.sin_zero),8);  //绑定套接口  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)  {   perror("bind");   exit(1);  }  //创建监听套接口  if(listen(sockfd,10)==-1) {   perror("listen");   exit(1);  }  printf("server is run.../n");  //等待连接  while(1) {   sin_size = sizeof(struct sockaddr_in);   //如果建立连接,将产生一个全新的套接字,their_fd存储发送方的信息   //一个套接字与客户端保持控制连接,新套接字与客户端传递、接受信息   if((new_fd = accept(sockfd,(struct sockaddr *)   &their_addr,&sin_size))==-1)   {    perror("accept");    exit(1);   }   //显示客户端信息   showClientInf(their_addr);   //生成一个子进程来完成和客户端的会话,父进程继续监听   if(!fork()) {   //读取客户端发来的信息   //只能用sizeof取buff的大小,因为buff还没初始化,用strlen很容易碰到'/0'    if((numbytes = recv(new_fd,buff,sizeof(buff),0))==-1)    {     perror("recv");     exit(1);    }    buff[numbytes]='/0';    printf("recieved %d bytes./n",numbytes);    printf("the message is:%s/n",buff);    //将从客户端接收到的信息再发回客户端    if(send(new_fd,buff,strlen(buff),0)==-1)     perror("send");    close(new_fd);    exit(0);   }   close(new_fd);  }  close(sockfd); } 打包下载: http://files.cnblogs.com/lzcarl/tcp.rar

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年10月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档