当前位置:编程学习 > C/C++ >>

C语言实现基本服务器与客户端

服务器代码: 
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
   int res,listenfd,clientfd;   //返回值,监听套接字,客户套接字
   char buff[BUFSIZ]="";
   int len;  
   struct sockaddr_in serveraddr;  //地址类型
   bzero(&serveraddr,sizeof(serveraddr));   //清空
   serveraddr.sin_family=AF_INET;   //使用AF_INET域
   serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);    //可以连接到本服务器的地址类型,即IP类型,这里是任意类型
   serveraddr.sin_port=htons(50002);//指定端口号
   len=sizeof(serveraddr);
   listenfd=socket(AF_INET,SOCK_STREAM,0); //创建套接字
   bind(listenfd,(struct sockaddr*)&serveraddr,len);//命名套接字
   listen(listenfd,23);  //设置可连接的数量
   clientfd=accept(listenfd,NULL,NULL);  //接受链接
   printf("connecct a client\n");
   while(strncmp(buff,"end",3))
   {
      res=read(clientfd,buff,BUFSIZ); //从客户端读取数据
      write(2,buff,res); //把数据显示到显示器,最好用write来显示,如果用printf灯可能显示上次留下的数据
      write(clientfd,"server",6); //往客户端写数据
   }
   close(clientfd);//关闭客户端
   close(listenfd); //关闭监听
   exit(0);
}
客户端代码:
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char *argv[])
{
   int res,connfd,len;   //返回值,连接套接字,地址长度
   struct sockaddr_in connaddr;  //客户端要链接的服务器的地址,应该与服务器的地址一致
   char buff[BUFSIZ];
   bzero(&connaddr,sizeof(connaddr));   //清空套接字
   if(argc<2)
   {
     printf("the option is too less\n");
     exit(0);
   }
   connaddr.sin_family=AF_INET;    //使用AF_INET域
   connaddr.sin_addr.s_addr=inet_addr(argv[1]);//确定要链接的地址
   connaddr.sin_port=htons(50002);//要链接的端口号
   connfd=socket(AF_INET,SOCK_STREAM,0);//创建套接字
   len=sizeof(connaddr);//获取地址长度
   connect(connfd,(struct sockaddr*)&connaddr,len);//创建链接
   write(connfd,"Hello !",7);//往服务器写数据
   while(res=read(connfd,buff,BUFSIZ))
   {
      printf("%d\n",res); //显示收到的字节数
      res=read(fileno(stdin),buff,BUFSIZ); //从服务器读取数据
      write(connfd,buff,res);
   }
   close(connfd);//关闭套接字
   exit(0);
}
 
虽然每次服务器,客户端都会给对方发送一个ACK来确认收到,但read函数一般不会读取到,如果某一方发送FIN或RST信号,read都会当作读到文件尾来处理,即返回0;
补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,