套接字是通信断点的抽象,网络编程中,套接字对于大多数通信细节做了隐藏,使程序员操作起来比较简单。
1、建立和销毁套接字描述符
Linux环境中使用socket函数创建一个套接字,函数原型如下:
int socket(int domain,int type,int protocol);
头文件: #include<sys/types.h>、#include<sys/socket.h>
参数说明:
第一个参数domain是通信域,“AF_INET”表示IPv4,“AF_INET6”表示IPv6。
第二个参数是套接口的类型,SOCK_STREAM表示是TCP协议,SOCK_DGRAM表示是UDP协议,SOCK_RAW表示是绕过协议,SOCK_SEQPACKET表示STCP协议。
第三个参数通常设置为0。
返回值:系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。
2、地址绑定
只有绑定了地址的套接字才能用于网络通信,因此需要将套接字与一个地址绑定,Linux环境下使用bind()函数将一个套接字绑定到一个地址上,函数如下:
int bind(int sockfd,struct sockaddr*my_addr,int addrlen);
头文件:#include<sys/types.h>、#include<sys/socket.h>
参数说明:
第一个参数sockfd是由socket()调用返回的套接口文件描述符。
第二个参数my_addr是指向数据结构sockaddr的指针。数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。
第三个参数addrlen可以设置成sizeof(structsockaddr)。
返回值:如果绑定成功函数返回0,失败返回-1。
3、建立一个连接
套接字与地址绑定之后,就可以建立一个连接,在Linux环境下使用connect函数主动建立一个连接,函数原型如下:
int connect(int sockfd,struct sockaddr* serv_addr,int addrlen);
头文件:#include<sys/types.h>、#include<sys/socket.h>
参数说明:
第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。
第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。
第三个参数可以使用sizeof(structsockaddr)而获得。
返回值:如果建立连接成功函数返回0,失败返回-1。
客户端主动建立连接,服务器端接受连接。服务器端接受连接分为两步,第一步,创立一个套接字监听连接请求,第二步,创立一个新的套接字接受并且处理请求。Linux环境中使用listen函数监听连接请求,函数如下:
intl isten(int sockfd,int backlog);
头文件:#include<sys/socket.h>
参数说明:
第一个参数是用来进行连接请求监听的套接字描述符。
第二个参数表示最多可以排队等待连接的请求数量。
返回值:成功返回0,失败返回-1。
调用listen函数之后,该套接字就可以开始监听请求了,接受连接请求使用accept函数,函数如下:
intaccept(intsockfd,void*addr,int*addrlen);
头文件:#include<sys/socket.h>
参数说明:
第一个参数是正在监听端口的套接口文件描述符。
第二个参数是一个地址结构,改地址往往是客户端的地址,一般设置为NULL。
第三个参数表示取得的客户端地址的大小,这个值要小于用户提供的缓冲区大小。如果忽略改地址,设置为NULL.
返回值:成功返回0,失败返回-1。
应用实例:
服务器端程序
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <strings.h> #include <ctype.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAX_LINE 100 /*处理函数,用于将大写字符转换成小写字符。参数为需要转换的字符串*/ void my_fun(char *p) { if(p == NULL) return ; for(; *p != '