网络编程api接口简介



客户端:
int main()
{
 int sockfd=socket(AF_INET,SOCK_STREAM,0);//(1)头文件sys/socket.h,建立套接字
 assert(sockfd!=-1);
 
 struct sockaddr_in saddr,caddr;//(2)给建立的套接字设置属性用于绑定
 memset(saddr,0,sizeof(saddr));
 saddr.sin_family=AF_INET;
 saddr.sin_port=htons(xxx);//头文件netinet/in.h,host to net short将十进制整数
转化为网络编码。short主要用于端口号,long用于ip地址,本程序用自定义局域网ip地址
所以使用inet_addr函数。

 saddr.sin_addr.s_addr=inet_addr(xxx)//头文件arpa/inet.h自己设定的地址也可以
使用inet_aton,类似网络转十进制整数inet_ntoa.

 int res=bind(sockfd,(sockaddr *)saddr,sizeof(saddr));//(3)绑定,将linux
特有的sockaddr_in转化为通用的sockaddr结构体绑定在sockfd上。

 assert(res!=-1);

 listen(sockfd,5)//(4)创建监听套接字等待三次握手

 while(1)
 {
  int len=sizeof(caddr);
  int c=accpet(sockfd,(sockaddr *)&caddr,&len);//(5)将完成3次握手的客户
端与套接字c建立一对一的交互模式。客户端信息在caddr中。sockfd继续监听。

  if(c<0)
  {
   continue;
  }
  printf("ip=%s,port=%d\n",inet_ntoa(caddr.sin_addr.s_addr),ntohs(caddr.sin_port))
//由于是自主设定的ip局域网所以不使用ntohl,类似有htonl,ntohl,htons,ntohs。


  while(1)
  {
   char buff[128]={0};
   if(recv(c,buff,127,0)<=0)
   {
    break;
   }
   printf("buff=%s\n",buff);
   send(c,"ok",2,0);
  }
  close(c);
 }
}


客户端:
int main()
{
 int c=socket(AF_INET,SOCK_STREAM,0);
 assert(c!=-1);
 
 struct sockaddr_in saddr;
 memset(&saddr,0,sizeof(saddr));
 saddr.sin_family=AF_INET;
 saddr.sin_port=htons(xxx);
 saddr.sin_addr.s_addr=inet_aton("xx.xx.xx");
 
 int res=connect(c,(sockaddr *)saddr,sizeof(saddr));
 assert(res!=-1);

 while(1)
 {
  char buff[128]={0};
  fgets(buff,127,stdin);
  if(compare(buff,"end",3)==0)
  {
   break;
  }
  send(c,buff,strlen(buff),0);

  memset(buff,0,128);
  recv(sockfd,buff,127,0);
  printf("buff=%s\n",buff);
 }
 close(c);
}


#程序假设接收速度要远超过键盘输入速度,不会粘包#
监听套接字主要是从sockfd绑定而来,因此设置的都是自己的参数,而如本程序中c是一对一唯一识别
的套接字所以在connect()和accpet()函数api都是在保存交互对象的信息。

猜你喜欢

转载自blog.csdn.net/qq_41784469/article/details/79445858
今日推荐