Socket编程

来源:互联网 发布:js循环json 输出html 编辑:程序博客网 时间:2024/06/08 18:18

Socket编程

一. 基本socket函数

1. socket函数
  • 函数原型:int socket(int domain, int type, int protocol)
  • 功能说明:调用成功,返回socket描述符;失败,返回-1,并设置errno
  • 参数说明
    1. domain:指明使用的协议族,通常为AF_INET,表示TCP协议;
    2. type:指定socket的类型,有SOCK_STREAM(流套接字,供TCP使用),SOCK_DGRAM(数据报套接字,供UDP使用),SOCK_RAW(源套接字,供原始套接字使用)
    3. protocol:通常设为0
2. bind函数
  • 函数原型:int bind(int fd, struct sockaddr_in* addr, int addrlen)
  • 功能说明:将套接字与指定的端口绑定。成功返回0,失败返回-1,并设置errno
  • 参数说明:

    1. fd:socket描述符
    2. addr:指向包含有本机IP地址及端口号等信息的sockaddr类型的指针。

      struct sockaddr_in{
      short int sin_family;
      unsigned shot int sin_port;
      struct in_addr sin_addr;
      unsigned char sin_zero[8];
      }

    3. addrlen:为sockaddr的长度

3. connect函数
  • 函数原型:int connect(int fd, struct sockaddr* serv_addr, int addrlen)
  • 功能说明:客户端发送连接请求。成功返回0,失败返回-1,并设置errno
  • 参数说明:
    1. fd:socket描述符
    2. serv_addr:包含服务器IP和端口的sockaddr类型的指针
    3. addrlen:结构sockaddr_in的长度
4. listen函数
  • 函数原型:int listen(int fd, int backlog)
  • 功能说明:等待指定的端口出现客户端连接。成功调用返回0,失败返回-1,并设置errno
  • 参数说明:
    1. fd:socket描述符
    2. backlog:指定请求队列允许的最大请求数
5. accept函数
  • 函数原型:int accept(int fd, struct sockaddr* addr, socklen_t* addrlen)
  • 功能说明:从已完全连接队列中取出头部第一个连接,调用成功返回已完成连接的描述符,失败返回0,并设置errno
  • 参数说明:
    1. fd:监听的socket描述符
    2. addr:指向sockaddr_in变量的指针,用来存储客户端的IP和端口等信息
    3. addrlen:结构sockaddr的长度,必须传入参数
6. write函数
  • 函数原型:ssize_t write(int fd, void* buf, size_t nbyte)
  • 功能说明:write函数将buf中的nbyte字节内容写入到文件描述符fd。成功返回实际写入的字节数,失败返回-1,并设置errno
  • 注意:在网络程序中,当我们向套接字文件描述符写时有两种可能:
    1. 返回值大于0,表示写了部分数据或全部数据
    2. 返回值小于0,出现了错误。如果errno为EINTR表示在写的时候出现了中断错误;如果errno为EPIPE表示网络连接出现了问题。
    3. 在非阻塞模式下,返回值等于0,表示连接已关闭
7. read函数
  • 函数原型:ssize_t read(int fd, void* buf, size_t nbyte)
  • 函数功能:read函数从fd中读取nbyte字节到buf中。当读成功时,返回实际所读的字节数,如果返回0表示已经读到文件结束了,小于0表示出现了错误。
  • 注意:如果errno为EINTR说明读是由中断引起的,如果错误为ECONNREST表示网络连接出现了问题。
8. close函数
  • 函数原型:int close(int fd)
  • 功能说明:释放fd,调用成功返回0,失败返回-1,并设置errno
9. send函数和recv函数

send & recv函数说明

10. fcntl函数
  • 函数原型:int fcntl(int fd, int cmd, long arg)
  • 函数功能:对socket进行设置,通常用来将socket设置为非阻塞模式
  • int cflags = fcntl(socket_df,F_GETFL,0);
  • fcntl(sockfd,F_SETFL,O_NONBLOCK)

二,字节转换函数

头文件:#include < netinet/in.h >

1. unsigned short int htons(unsigned short int hostshort)
  • 主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes
2. unsigned long int htonl(unsigned long int hostlong)
  • 主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes
3. unsigned short int ntohs(unsigned short int netshort)
  • 网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes
4. unsigned long int ntohs(unsigned long int netshort)
  • 网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes

三,IP转换函数

1. unsigned long int inet_addr(const char* cp)
  • 该函数把一个用数字和点表示的IP地址的字符串转换成一个无符号长整型
  • s_addr = inet_addr(“192.168.1.108”)
2. int inet_aton(const char* cp, struct in_addr* inp)
  • 该函数将字符串形式的IP地址转换成二进制形式的IP地址;成功返回1,失败返回-1。转换后的IP地址存储在inp中。
3. char* inet_ntoa(struct in_addr in)
  • 将32位二进制形式的IP地址转换成数字点形式的IP地址,结果在函数返回值中返回。

四,字节处理函数

头文件:#include < string.h >

1. void bzero(void* s, int n)
  • 将参数s指定的内存的前n个字节设置为0,通常用它来将套接字地址清0
2. void bcopy(const char* src, void* dest, int len)
  • 从参数src指定的内存区copy指定数目的字节内容到参数dest指定的内存区域
3. int bcmp(const void* s1, const void* s2, int n)
  • 比较参数s1指定的内存区域和参数s2指定的内存区域的前n个字节的内容,相同返回0,否则返回非0
4. void* memset(void* s, int c, size_t n)
  • 将参数s指定的内存区域的前n个字节设置为参数c的内容
5. void* memcpy(void* dest, const void* src, size_t n)
  • 功能同bcopy,区别在于bcopy能处理src和dest指定的区域由重叠的情况,而memcpy不能
6. int memcmp(const void* s1, const void* s2, size_t n)
  • 比较参数s1指定的内存区域和参数s2指定的内存区域的前n个字节的内容,相同返回0,否则返回非0
0 0
原创粉丝点击