unix下编写socket程序的一般步骤

裂变心痕

裂变心痕

2016-02-19 21:32

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的unix下编写socket程序的一般步骤,希望大家看完后能赶快学习起来。
在unix下写socket程序可能是最方便,你只要把握其一般步骤,就可以松的写出面向传输层的应用。
  
  1、理解几个常用的socket函数
  
  #include
  
  #include
  
  int socket(int domain,int type,int portocol);
  
  domain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接的udp)
  
  int bind(int s,const strUCt sockaddr *address,size_t address_len);
  
  s为socket返回的文件描述符
  
  address为协议族名称和其他信息
  
  具体结构为struct sockaddr_in{
  
   short sin_family;/*协议族
  
   u_short sin_port;/*端口*/
  
   struct in_addr sin_addr;/*地址*/
  
   char sin_zero[8];
  
  };
  
  int listen(int s,int backlog);
  
  backlog为容许的请求数目
  
  int accept(int s,struct sockaddr *address,int *address_len);
  
  这里的前两个参数同上
  
  addres_len是要传递一个记有结构大小的地址
  
  int connect(int s,struct sockaddr *address,size_t address_len);
  
  这里的参数意义同bind
  
  2.理解建立程序的一般调用过程
  
  要建立一个处理连接的服务器端程序,首先要调用socket函数创建一个socket,返回一个文件句柄fd,使以后对它的操作就象对普通文件设备一样读写。
  
  由于是服务器端必须对一个断口进行监听其他机器的请求,所以接下去调用bind函数,传入刚才的fd,定义好地址和端口,由于是要接受来自任何host的连接所以应讲sin_addr赋为INADDR_ANY,port为你所设定的端口。
  
  注重:这里的地址和端口是网络字节顺序,所以要调用htonl,htons完成主机字节顺序
  到网络字节的转变
  
  接下来就是监听listen,调用accept接受来自客户端的请求,accpet返回连接后的文件描述符,你就可以用它进行收发信息(对应于read,write)这样的一个过程就是socket-bind-listen-accpet-Read,write
  而对于客户端则是socket-connect-read,write 三层交换技术 交换机与路由器密码恢复 交换机的选购 路由器设置专题 路由故障处理手册 数字化校园网解决方案
  3.一个完整的程序
  
  
  #include
  #include
  #include /*包含有htons等函数的头文件*/
  
  #include
  #include
  
  void main()
   {
  int listenfd,clifd;
  long pid;
  struct sockaddr_in myaddr,cliaddr;
  
  int ret;
  int len;
  
  listenfd=socket(AF_INET,SOCK_STREAM,0);
  if (listenfd0)
   {
  perror("socket error");
  exit(-1);
   }
  
  myaddr.sin_family=AF_INET;
  myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  myaddr.sin_port=htons(8888);
  
  ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
  if (ret0)
   {
  perror("bind error");
  exit(-1);
   }
  listen(listenfd,10);
  len=sizeof(struct sockaddr);
  while(1)
   {
  clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
   /*注重accept的第三个参数也是地址*/
  if(clifd==-1)
   {
  
     perror("accept error");
    continue;
    }
  printf("connect from %s %d",inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));
  
  switch(pid=fork())
   {
    case 0: /*子进程*/
     close(listenfd);
     ;/*子进程进行其他的操作*/
     close(clifd);
     exit(0);
     break;
    case -1:
     perror("fork error");
     break;
     default:/*父进程*/
     close(clifd);
     break;
  
    }
   }
  
  }
  
  
  4.程序说明
  
  该程序的功能是监听8888端口的连接,对所有的对8888端口的连接显示出地址和对方的端口号该程序在sco unix下调试通过,在其他unix和Linux平台请注重inet_ntoa,htons函数所应在的头文件的名称
  
  同时该程序用到了并发的观点,因为accept,read,write均为阻塞(block)的函数,一旦进程block将不能处理其他请求,所以用主进程进行listen,由子进程进行负责对客户端传输数据.
  
  你可以在同一台unix机器用telnet localhost 8888进行观察程序会输出connect from 127.0.0.1 xxxx
展开更多 50%)
分享

猜你喜欢

unix下编写socket程序的一般步骤

编程语言 网络编程
unix下编写socket程序的一般步骤

利用Delphi编写Socket通信程序

Delphi
利用Delphi编写Socket通信程序

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

化妆的一般步骤 化妆步骤是怎样的

化妆
化妆的一般步骤   化妆步骤是怎样的

象孩子一般去绘画(下)

教育 绘画 育儿知识 怀孕 孕妇
象孩子一般去绘画(下)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

护肤化妆的正确步骤 面部化妆的一般步骤

季节护肤 护肤步骤 DIY护肤 夏季护肤 美容护肤 美白护肤
护肤化妆的正确步骤 面部化妆的一般步骤

Visual C# 2005中编写Socket网络程序

编程语言 网络编程
Visual C# 2005中编写Socket网络程序

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

wps格式刷快速进行排版技巧

wps格式刷快速进行排版技巧

更改Excel数据导入源文件地快捷办法

更改Excel数据导入源文件地快捷办法
下拉加载更多内容 ↓