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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值