1.socket()
无论是客户端还是服务器端,在使用套接字之前都要创建套接字。
在socket API中socket()函数用来创建一个套接字
函数原型为:
#include<sys/socket.h>
int socket(int domain, int type,int protocol)
socket()执行成功返回非负数的套接字,失败将返回-1.
domain:告诉系统使用什么地址协议族,通常情况下使用AF_INET。
type:指的是socket类型。常用的socket类型有两种,流式socket(SOCK_STREAM)和数据报socket(SOCK_DGRAM)。
流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报socket是一种无连接的socket,对应于
无连接的UDP服务应用。
protocol:指定更精确的协议,通常赋值为0。系统会根据前两个参数选择一个合适的协议族。
2.connect()
主动请求连接是客户端的动作,TCP/IP客户端通常要调用connect()去连接一个服务端。
函数原型:
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);
sockfd:此参数为sockfd()返回的套接字。
serv_addr:形式上是一个指向sockaddr的指针,而实际上需要传递是特定的地址结构(如struct sockadd_in)的地址。
addrlen:表示第二个参数的字节数(如sizeof(struct sockaddr_in))。
如果connect()调用成功,表示连接已经建立,返回值为0,否则返回值为-1并将错误码代存于全局变量errno之中。
有可能导致connect()失败的原因有指定的IP地址主机可能不存在,没有找到指定的路由;远程服务器端未启动或者指定
端口在远程服务器上并未启动监听等等。出错的原因可以使用perror()函数来输出错误信息。
3.write()
write()函数向连接套接字写入数据。
函数原型:
#include<unistd.h>
int write(int sockfd,void *buf,size_t nbytes)
sockfd:为已连接的套接字
buf:用于保存数据的缓冲区
nbytes:指出buf中期望写入的字节数
4.read()
read()函数是从已连接套接字读入数据。
函数原型:
#include<unistd.h>
int read(int sockfd,void *buf,size_t nbytes)
sockfd:为已连接套接字
buf:用于保存数据的缓冲区。
nbytes:指出期望读入的字节数
read()函数成功时将返回读入的字节数,返回0表示套接字已关闭,出错返回-1并设置error。
5.close()
关闭套接字可以简单调用close()函数。
函数原型:
#include<unistd.h>
int close(int sockfd);
其中,参数sockfd可以是打开的任何类型的文件描述字,包括套接字。close()调用成功返回0,失败返回-1,并用出错代码设置errno。
5.bind()
bind()函数为套接字捆绑本地端口和地址
函数原型:
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
sockfd:为成功调用socket函数返回的套接字
addr:用于指定本地端口和地址
addrlen:用于指出addr结构的字节数
bind()调用成功返回0否则返回-1并将错误码存放于全局变量errno中,失败的原因可能是指定的地址格式不正确,或指定TCP端口已经被其
他进程的套接字占用,或者已经对该套接字调用过bind()。
6.listen()
创建一个套接口并监听申请的连接
函数原型:
#include<sys/socket.h>
int listen(int sockfd,int backlog)
sockfd:为成功调用socket函数返回的套接字,并已经成功调用bind()。
backlog:告诉套接字在忙于处理上一个请求时还可以接受多少个进入的请求。换句话说,这决定了挂起连接的队列的大小。
listen()调用成功返回0,失败返回-1并将错误存放于全局变量errno之中。
7.accept()
接受网络连接
函数原型:
#include<sys/socket.h>
int accept(int sockfd,struct sockadd *addr,socklen_t *addrlen);
sockfd:为成功调用socket()返回的套接字,并且已经以它为参数成功调用了bind()和listen()。
addr:返回客户端的地址和端口号。
addrlen:”值-结果“参数,它是一个指向32位整数的指针,调用前,需将addrlen所指向整数值置为由addr地址结构所占用的字节,返回时,这个整数
的值将被填写成地址结构的准确长度。
返回非负数说明accept()调用成功,返回值为一个新的套接字,这个套接字代表着与客户的TCP连接,服务器端将使用这个新套接字与客户通信。accept()返回的套接字
称为已连接的套接字,对于服务器端调用socket()返回的套接字称为监听套接字。
无论是客户端还是服务器端,在使用套接字之前都要创建套接字。
在socket API中socket()函数用来创建一个套接字
函数原型为:
#include<sys/socket.h>
int socket(int domain, int type,int protocol)
socket()执行成功返回非负数的套接字,失败将返回-1.
domain:告诉系统使用什么地址协议族,通常情况下使用AF_INET。
type:指的是socket类型。常用的socket类型有两种,流式socket(SOCK_STREAM)和数据报socket(SOCK_DGRAM)。
流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报socket是一种无连接的socket,对应于
无连接的UDP服务应用。
protocol:指定更精确的协议,通常赋值为0。系统会根据前两个参数选择一个合适的协议族。
2.connect()
主动请求连接是客户端的动作,TCP/IP客户端通常要调用connect()去连接一个服务端。
函数原型:
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);
sockfd:此参数为sockfd()返回的套接字。
serv_addr:形式上是一个指向sockaddr的指针,而实际上需要传递是特定的地址结构(如struct sockadd_in)的地址。
addrlen:表示第二个参数的字节数(如sizeof(struct sockaddr_in))。
如果connect()调用成功,表示连接已经建立,返回值为0,否则返回值为-1并将错误码代存于全局变量errno之中。
有可能导致connect()失败的原因有指定的IP地址主机可能不存在,没有找到指定的路由;远程服务器端未启动或者指定
端口在远程服务器上并未启动监听等等。出错的原因可以使用perror()函数来输出错误信息。
3.write()
write()函数向连接套接字写入数据。
函数原型:
#include<unistd.h>
int write(int sockfd,void *buf,size_t nbytes)
sockfd:为已连接的套接字
buf:用于保存数据的缓冲区
nbytes:指出buf中期望写入的字节数
4.read()
read()函数是从已连接套接字读入数据。
函数原型:
#include<unistd.h>
int read(int sockfd,void *buf,size_t nbytes)
sockfd:为已连接套接字
buf:用于保存数据的缓冲区。
nbytes:指出期望读入的字节数
read()函数成功时将返回读入的字节数,返回0表示套接字已关闭,出错返回-1并设置error。
5.close()
关闭套接字可以简单调用close()函数。
函数原型:
#include<unistd.h>
int close(int sockfd);
其中,参数sockfd可以是打开的任何类型的文件描述字,包括套接字。close()调用成功返回0,失败返回-1,并用出错代码设置errno。
5.bind()
bind()函数为套接字捆绑本地端口和地址
函数原型:
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
sockfd:为成功调用socket函数返回的套接字
addr:用于指定本地端口和地址
addrlen:用于指出addr结构的字节数
bind()调用成功返回0否则返回-1并将错误码存放于全局变量errno中,失败的原因可能是指定的地址格式不正确,或指定TCP端口已经被其
他进程的套接字占用,或者已经对该套接字调用过bind()。
6.listen()
创建一个套接口并监听申请的连接
函数原型:
#include<sys/socket.h>
int listen(int sockfd,int backlog)
sockfd:为成功调用socket函数返回的套接字,并已经成功调用bind()。
backlog:告诉套接字在忙于处理上一个请求时还可以接受多少个进入的请求。换句话说,这决定了挂起连接的队列的大小。
listen()调用成功返回0,失败返回-1并将错误存放于全局变量errno之中。
7.accept()
接受网络连接
函数原型:
#include<sys/socket.h>
int accept(int sockfd,struct sockadd *addr,socklen_t *addrlen);
sockfd:为成功调用socket()返回的套接字,并且已经以它为参数成功调用了bind()和listen()。
addr:返回客户端的地址和端口号。
addrlen:”值-结果“参数,它是一个指向32位整数的指针,调用前,需将addrlen所指向整数值置为由addr地址结构所占用的字节,返回时,这个整数
的值将被填写成地址结构的准确长度。
返回非负数说明accept()调用成功,返回值为一个新的套接字,这个套接字代表着与客户的TCP连接,服务器端将使用这个新套接字与客户通信。accept()返回的套接字
称为已连接的套接字,对于服务器端调用socket()返回的套接字称为监听套接字。