您的位置:首页 > 理论基础 > 计算机网络

Unix c 网络编程——编程基础

2015-11-08 17:11 513 查看
一个完整socket的相关描述(协议,本地地址,本地端口,远程地址,远程端口);

每个socket有一个本地的唯一socket号,由操作系统分配。

=====================================================================================

#include<sys/socket.h>

int socket(int domain,int type,int protocol); //成功返回描述符,出错返回-1。

domain:

      AF_INET(IPv4因特网域)

      AF_INET6(IPv6因特网域)

      AF_UNIX(UNIX域)

      AF_UNSPEC(未指定)

type:

      SOCK_DGRAM(无连接基于数据报)

      SOCK_STREAM(面向连接基于字节流)

      SOCK_SEQPACKET(面向连接基于数据报)

      SOCK_RAW(IP协议数据报接口)

protocol:

      通常为0,表示选择默认协议。

      (AF_INET、SOCK_DGRAM、UDP)

      (AF_INET、SOCK_STREAM、TCP)

=====================================================================================

字节序列转换

转换端口号:

      htons()   

      ntohs()

转换IP:

      htonl()

      ntohl()

=====================================================================================

通用地址格式

      struct sockaddr{

         unsigned short sa_family;//address族,AF_xxx

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

      }

sa_family一般来说,IPV4使用AF_INET。

sa_data包含了一项远程电脑的地址,端口和套接字的数目,里面的数据是杂溶在一起的

=====================================================================================

因特网地址格式

      struct in_addr{

         in_addr_t s_addr   //ipv4

      };

      struct sockaddr_in{

         short int sin_family;     //地址族

         unsigned short int sin_port;  //端口号

         struct in_addr sin_addr;     //ip地址

         unsigned char sin_zero[8];   //添0

      }

=====================================================================================

地址格式转换

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

const char *inet_ntop(int domain,const void *addr,char *str,socklen_t cnt);//转换成点分十进制

成功返回字符串指针,出错返回NULL。

int inet_pton(int domain,const char *str,void *addr); //转换成二进制整数

成功返回1,无效格式返回0,出错返回-1。

======================================================================================

套接字域地址绑定

#include <sys/socket.h>

int bind(int sockfd,const struct sockaddr *addr,socklen_t len);//绑定地址并在/etc/servies中注册

int getsockname(int sockfd,struct sockaddr *addr,socklen_t alenp);//查找绑定到套接字的地址

int getpeername(int sockfd,struct asockaddr *addr,socklen_t *alenp);//获取对方地址

成功返回0,出错返回-1。

======================================================================================

客户端:

#include <sys/socket.h>

int connect(int sockfd,const struct sockaddr *addr,socklen_t len);

成功返回0,出错返回-1.

服务端:

#include <sys/socket.h>

int listen(int sockfd,int backlog);

成功返回0,出错返回-1.

int accept(int sockfd,struct sockaddr *addr,socklen_t len);

======================================================================================

tcp 用write read

======================================================================================

udp 用

#include <sys/socket.h>

ssize_t send(int sockfd,const void *buf,size_t nbytes,int flags);

ssize_t sendmsg(int sockfd,const struct msghdr *msg,int flags);

成功返回发送字节数,出错返回-1.

struct msghdr{

   void *msg_name; //optional address

   socklen_t msg_namelen;  //address size in bytes

   struct iovec *msg_iov;  //array of I/O buffers

   int msg_iovlen; //number of elements in array

   void *msg_control;  //number of ancillary bytes

   int msg_flags;     //flags for received message

}

ssize_t recv(int sockfd ,void *buf,size_t nbytes,int flags);//常用

ssize_t recvfrom(int sockfd ,

                  void *buf,

                  size_t len,

                  int flags,

                  struct sockaddr *addr,

                  socklen_t *addrlen);

ssize_t recvmsg(int sockfd,struct msghdr *msg,int flags);

返回消息字节数,无消息返回0,出错返回-1.

=======================================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息