网络编程中的常用函数整理

来源:互联网 发布:php log打印到日志 编辑:程序博客网 时间:2024/05/19 02:23

网络编程常用到的函数,进行整理。先上图

基于TCP协议:
这里写图片描述

基于UDP协议:

这里写图片描述

常用函数:

socket:
函数原型:int socket(int domain, int type, int protocol);
参数说明:
domain:称协议族(family),常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域Socket)、AF_ROUTE等。协议族决定了socket的地址类型,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
type:指定socket类型。常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。SOCK_STREAM是一种面向连接的socket,针对TCP服务应用。SOCK_DGRAM是一种无连接的socket,对应UDP服务应用。
protocol:指定协议。常用协议有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
注意:type和protocol不可以随意组合,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当第三个参数为0时,会自动选择第二个参数类型对应的默认协议。
返回值:如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET(Linux下失败返回-1)套接字描述符是一个整数类型的值。

绑定:
函数原型:int bind(SOCKET socket, const struct sockaddr* address, socklen_t address_len);
参数说明:
socket:是一个套接字描述符。
address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
address_len:确定address缓冲区的长度。
返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。

监听
头文件:#include <sys/socket.h>
函数原型:int listen( int sockfd, int backlog);
函数说明:监听来自客户端的tcp socket的连接请求
参数说明:
sockfd:用于标识一个已捆绑未连接套接口的描述字。
backlog:等待连接队列的最大长度。
返回值:如无错误发生,listen()返回0。否则的话,返回-1

接收连接请求
函数原型:int accept( int fd, struct socketaddr* addr, socklen_t* len);
参数说明:
fd:套接字描述符。
addr:返回连接着的地址
len:接收返回地址的缓冲区长度
返回值:成功返回客户端的文件描述符,失败返回-1。

连接
头文件:#include <sys/socket.h>
函数原型: int connect(int s, const struct sockaddr * name, int namelen);
参数说明:
s:标识一个未连接socket
name:指向要连接套接字的sockaddr结构体的指针
namelen:sockaddr结构体的字节长度

发送 sendto
头文件:
#include < sys/types.h > #include < sys/socket.h >
函数原型:

int sendto ( socket s , const void * msg, int len, unsigned int flags, const struct sockaddr * addr , int tolen ) ;

函数说明:sendto() 用来将数据由指定的socket传给对方主机。
参数说明:
s:已建好连接的socket,如果利用UDP协议则不需经过connect操作。
msg:待发送数据的缓冲区
len:缓冲区长度
flags:调用方式标志位, 一般为0, 改变flags,将会改变sendto发送的形式。
addr:(可选)指针,指向目的套接字的地址
tolen:addr所指地址的长度
返回值:如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR。

发送 send
函数原型:
int send( socket s, const char FAR* buf, int len, int flags);

函数说明:向一个已连接的套接口发送数据。
参数说明:
s:一个用于标识已连接套接口的描述字。
buf:包含待发送数据的缓冲区。
len:缓冲区中数据的长度。
flags:调用执行方式。
返回值:如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR。

接收recv
函数原型:int recv(socket s, char FAR* buf, int len, int flags);
函数说明:recv()用来接收指定的socket传来的数据,并把数据传到由参数buf指向的内存空间。
参数说明:
socket:一个标识已连接套接口的描述字。
buf:用于接收数据的缓冲区。
len:缓冲区长度。
flags:指定调用方式。取值:MSG_PEEK 查看当前数据,数据将被复制到缓冲区中,但并不从输入队列中删除;MSG_OOB 处理带外数据。
返回值:若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

接收recvfrom
函数原型:

int recvfrom(socket s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen);

函数说明:接收一个数据报并保存源地址。
参数说明:
s:标识一个已连接套接口的描述字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式,一般设置为0。
from:(可选)指针,用来指定欲接收数据的网络地址。
fromlen:(可选)指针,指向from长度值。
返回值:成功则返回接收到的字符数,失败返回-1。
注意事项:与recv()函数的比较,UDP使用recvfrom()函数接收数据,他类似于标准的read(),但是在recvfrom()函数中要指明接收数据的源地址。对于recvfrom,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。不管是recv还是recvfrom,都有两种模式,阻塞和非阻塞,可以通过ioctl函数来设置。阻塞模式是一直等待直到有数据到达,非阻塞模式是立即返回,需要通过消息,异步事件等来查询完成状态。

结构体 sockaddr_in
头文件:#include < netinet/in.h >
结构体定义:

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

参数说明:
sin_family指代协议族,AF_INET(地址族)PF_INET(协议族),在socket编程中只能是AF_INET
sin_port端口号,在linux下端口号的范围0~65535,其中0~1024范围的端口号已经被系统使用或保留。必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字
sin_addr存储IP地址,使用in_addr这个数据结构:

struct in_addr {    in_addr_t s_addr;// s_addr按照网络字节顺序存储IP地址};

sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
其他信息:
可使用sockaddr_in建立所需信息,然后用memset函数初始化即可。

sockaddr_in mysock;memset((char*)&mysock,0,sizeof(mysock));mysock.sin_family=AF_INET;mysock.sin_port=htons(1234);//1234是端口号mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

线程创建
头文件:#include<pthread.h>
函数原型:int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),void *arg);

编译链接参数:-lpthread
参数说明:
tidp:指向线程标识符的指针,创建成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。
attr:设置线程属性。
start_rtn:函数指针,是线程运行函数的起始地址。该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
arg:是函数需用到的参数指针,。
返回值:线程创建成功,则返回0。线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。

设置socket
头文件:#include <sys/socket.h>
函数原型:int setsockopt ( socket s, int level, int optname,const char FAR* optval, int optlen);
函数说明:用于任意类型、任意状态套接口的设置选项值
参数说明:
s:设置参数s 所指定的socket 状态。
level:选项定义的层次;SOL_SOCKET(通用套接字),IPPROTO_IP(IP选项),IPPROTO_TCP(TCP选项)。
optname:需设置的选项。
optval:指针,指向存放选项值的缓冲区。
optlen:optval缓冲区的长度。
返回值:成功执行时,返回0。失败返回-1,具体错误信息在errno。

参考链接:
https://baike.baidu.com/item/pthread_create/5139072?fr=aladdin
http://blog.csdn.net/hudashi/article/details/7709413
https://baike.baidu.com/item/SOCKADDR_IN/3917215?fr=aladdin
https://baike.baidu.com/item/socket/281150?fr=aladdin
http://blog.csdn.net/tdk_root/article/details/7888574
Setsockopt 参考:http://www.cnblogs.com/eeexu123/p/5275783.html

原创粉丝点击