socket

来源:互联网 发布:最好合理网络理财 编辑:程序博客网 时间:2024/05/18 01:03

socket

1 几个重要的结构

  struct sockaddr

  {

      unsigned short sa_family; //地址类型,AF_XXX,TCPIP为AF_INET

      char sa_data[14];  //14字节的协议地址

  };

 struct sockaddr_in

 {

unsigned short sin_famlily;//地址类型

unsigned short int sin_port;//端口号

struct in_addr sin_addr; //IP地址

unsigned sin_zero[8];  // 填充地址,一般赋值为0

 };

 struct in_addr;

 {

     Unsigned long s_addr;  //long在C语言中是4字节

 }

2 创建socket

  #include <sys/types.h>

  #include <sys/socket.h>

  Int socket(int domain,int type,int protocol );

  参数说明:

  Domain用来指定创建套接字所使用的协议族:

  AF_UNIX:创建只在本机内进行通信的套接字

  AF_INET:使用IPV4 TCP/IP协议

  AF_INET6:使用IPV6 TCP/IP协议

  Type指定套接字的类型:

  SOCK_STREAM:创建TCP流套接字

  SOCK_DGRAM:创建UDP数据包套接字

  SOCK_RAW:创建原始套接字

 

  创建TCPSOCKET:int socket_fd =  socket(AF_INET,SOCK_STREAM,0);

  创建UDPSOCKET:int socket_fd = socket(AF_INET,SOCK_DGRAM,0);

 

3 建立连接

  #include <sys/types.h>

  #include <sys/socket.h>

  Int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen);

 

4 绑定套接字

  #include <sys/types.h>

  #include <sys/socket.h>

  int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen);

 

5 在套接字上监听

 #include <sys/socket.h>

 Int listen(int s,int backlog);

 

6 接受连接

  #include <sys/types.h>

  #include <sys/socket.h>

  Int accept(int s,struct sockaddr *addr,socklen_t *addrlen);

 

7 TCP套接字的数据传输

   #include <sys/types.h>

   #include <sys/socket.h>

   ssize_t send(int s,const void *msg,size_t len,int flags);发送数据

   ssize_t recv(int s, void *buf, size_t len,int flags);接受数据

 

8 UDP套接字的数据传输

  #include <sys/types.h>

  #include <sys/socket.h>

  ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socken_t len);

  发送数据

  ssize_t recvfrom(int s,const void *buf,size_t len,int flags,const struct sockaddr *from,socken_t fromlen);

  接收数据

 

9 关闭套接字

   #include <unistd.h>

   Int close(int fd);

 

   #include <sys/socket.h>

   Int shutdown(int s,int how);功能更全,能进行一个更细致的操作,比如单项关闭或全部禁止

 

10 主要系统调用函数

   1)大小端模式转换

#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong); //host to network long

unit16_t htons(unit16_t hostshort);//htons to network short

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

 

2) inet函数

Int inet_aton(const char *cp,struct in_addr *inp);//将字符串IP地址转化成网络字节顺序的二进制形式

char* inet_ntoa(struct in_addr in);//跟上面相反

还有 inet_addr ,inet_network,inet_lnaof,inet_imakeaddr,inet_netof;

查看man inet

 

11 获取和设置套接字属性

    #include <sys/types.h>

   #include <sys/socket.h>

   Int getsockopt(int s,int level,int optname.void *optval,socklen_t *optlen);

   Int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen);

 

12 多路复用select

  #include <sys/select.h>

  #include <sys/time.h>

  #include <sys/types.h>

  #include <unistd.h>

  Int select(int n,fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);

原创粉丝点击