struct sockaddr { u_charsa_len;//长度 u_short sa_family;//协议 char sa_data[14];//数据 };
struct sockaddr_in { u_char sin_len;//长度 u_short sin_family;//协议 u_short sin_port;//端口 structin_addr sin_addr;//ip地址 char sin_zero[8];//数据 };
structin_addr { u_longs_addr; };
用来表示一个32位的IPv4地址,其字节顺序为网络顺序。linux
功能:建立一个新的套接字,返回套接字描述符编程
参数说明:缓存
domain:域类型,指明使用的协议栈,如TCP/IP使用的是 PF_INET ,其余还有AF_INET六、AF_UNIX服务器
type:指明须要的服务类型, 如网络
SOCK_DGRAM:数据报服务,UDP协议dom
SOCK_STREAM:流服务,TCP协议socket
protocol:通常都取0(由系统根据服务类型选择默认的协议)函数
功能:为套接字指明一个本地端点地址指针
TCP/IP协议使用sockaddr_in结构,包含IP地址和端口号,服务器使用它来指明熟知的端口号,而后等待链接code
参数说明:
sockfd:套接字描述符,指明建立链接的套接字
my_addr:本地地址,IP地址和端口号
addrlen:地址长度
套接口中port=0表示由内核指定端口号,设定sin_addr为INADDR_ANY,由内核指定IP地址。
功能:
面向链接的套接字使用它将一个套接字置为被动模式,并准备接收传入链接。用于服务器,指明某个套接字链接是被动的
参数说明:
Sockfd:套接字描述符,指明建立链接的套接字
input_queue_size:该套接字使用的队列长度,指定在请求队列中容许的最大请求数
功能:获取传入链接请求,返回新的链接的套接字描述符。
为每一个新的链接请求建立了一个新的套接字,服务器只对新的链接使用该套接字,原来的监听套接字接收其余的链接请求。新的链接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。
参数说明:
Sockfd:套接字描述符,指明正在监听的套接字
addr:提出链接请求的主机地址
addrlen:地址长度
功能: 同远程服务器创建主动链接,成功时返回0,若链接失败返回-1。
参数说明:
Sockfd:套接字描述符,指明建立链接的套接字
Server_addr:指明远程端点:IP地址和端口号
sockaddr_len :地址长度
功能:
在TCP链接上发送数据,返回成功传送数据的长度,出错时返回-1。send会将外发数据复制到OS内核中,也可使用send发送面向链接的UDP报文。
参数说明:
sockfd:套接字描述符
data:指向要发送数据的指针
data_len:数据长度
flags:一般为0
若是send()函数的返回值小于len的话,则你须要再次发送剩下的数据。802.3,MTU为1492B,若是包小于1K,那么send()通常都会一次发送光的。
功能:
从TCP接收数据,返回实际接收的数据长度,出错时返回-1。
服务器使用其接收客户请求,客户使用它接受服务器的应答。若是没有数据,将阻塞。若是TCP收到的数据大于(/小于)缓存的大小,只抽出可以填满缓存的足够数据(/抽出全部数据并返回它实际接收的字节数)。也可使用recv接收面向链接的UDP的报文,若缓存不能装下整个报文,填满缓存后剩下的数据将被丢弃。
参数说明:
Sockfd:套接字描述符
Buf:指向内存块的指针
Buf_len:内存块大小,以字节为单位
flags:通常为0(MSG_WAITALL接收到指定长度数据时才返回),设置为 MSG_DONTWAIT为非阻塞
功能:
撤销套接字.若是只有一个进程使用,当即终止链接并撤销该套接字,若是多个进程共享该套接字,将引用数减一,若是引用数降到零,则关闭链接并撤销套接字。
参数说明:
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define MYPORT 8887 #define QUEUE 20 #define BUFFER_SIZE 1024 int main() { ///定义sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); ///定义sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出错返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind"); exit(1); } printf("监听%d端口\n",MYPORT); ///listen,成功返回0,出错返回-1 if(listen(server_sockfd,QUEUE) == -1) { perror("listen"); exit(1); } ///客户端套接字 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); printf("等待客户端链接\n"); ///成功返回非负描述字,出错返回-1 int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length); if(conn<0) { perror("connect"); exit(1); } printf("客户端成功链接\n"); while(1) { memset(buffer,0,sizeof(buffer)); int len = recv(conn, buffer, sizeof(buffer),0); //客户端发送exit或者异常结束时,退出 if(strcmp(buffer,"exit\n")==0 || len<=0) break; printf("来自客户端数据:%s\n",buffer); send(conn, buffer, len, 0); printf("发送给客户端数据:%s\n",buffer); } close(conn); close(server_sockfd); return 0; }
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define MYPORT 8887 #define BUFFER_SIZE 1024 char* SERVER_IP = "127.0.0.1"; int main() { ///定义sockfd int sock_cli = socket(AF_INET,SOCK_STREAM, 0); ///定义sockaddr_in struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(MYPORT); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr(SERVER_IP); ///服务器ip printf("链接%s:%d\n",SERVER_IP,MYPORT); ///链接服务器,成功返回0,错误返回-1 if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect"); exit(1); } printf("服务器链接成功\n"); char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) { printf("向服务器发送数据:%s\n",sendbuf); send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送 if(strcmp(sendbuf,"exit\n")==0) break; recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收 printf("从服务器接收数据:%s\n",recvbuf); memset(sendbuf, 0, sizeof(sendbuf)); memset(recvbuf, 0, sizeof(recvbuf)); } close(sock_cli); return 0; }
好比要产看socket()函数的用法,能够用man socket 指令:
man socket
若是以为linux下看的不习惯,能够导入到文件中用notepad++打开
man socket > ~/socket.txt //将socket的man手册导出到当前用户根目录下的socket.txt文件中