1.套接字描述符
套接字是网络通信端点的抽象,正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字。套接字中储存着各种信息,如:通信特性,套接字类型,协议等。
套接字函数原型
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
//返回值:成功返回文件(套接字)描述符,失败,返回-1
参数domain
AF_INET? ?IPv4因特网域
AF_INET6??IPv6因特网域
AF_UNIX UNIX域
AF_UNSPEC 未指定
参数 type
SOCK_DGRAM? ?固定长度的,无连接的,不可靠的报文传输
SOCK_RAW? IP协议的数据报接口
SOCK_SEQPACKET?固定长度的,有连接的,有序的,可靠的报文传输
SOCK_STREAM 有序的,可靠的,双向的,面向链接的字节流
参数protocol
IPPROTO_IP? ?IPv4网际协议
IPPROTO_IPV6? IPv6网际协议
IPPROTO_ICMP? 因特网控制报文协议
IPPROTO_RAW? 原始IP数据包协议
IPPROTO_TCP? 传输控制协议
IPPROTO_UDP? 用户数据报协议
2.TCP协议
TCP是有链接的,可靠的数据传输协议
?? ?服务器?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?客户端 1. 创建socket ?? ??? ??? ??? ??? ??? ??? ??? ?1. 创建socket? 2. 确定服务器协议地址簇?? ??? ??? ??? 2. 获取服务器协议地址簇 3. 绑定 4. 监听 5. 接受连接? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3. 连接服务器 ?? ?accept 函数是个阻塞函数 6. 通信? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4. 通信 7. 断开连接?? ??? ??? ??? ??? ??? ??? ??? ??? ?5. 断开连接
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>//套接字接口
#include<arpa/inet.h>//因特网定义
#include<netinet/in.h>//因特网地址族
int main(int argc,char* argv[])
{
if(argc!=3)printf("请输入IP地址和端口号\n"),exit(0);
int server=socket(AF_INET,SOCK_STREAM,0);//创建套接字
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);//IP地址
addr.sin_port=htons(atoi(argv[2]));//小端转换为大端
bind(server,(struct sockaddr*)&addr,sizeof(addr));//绑定
listen(server,10);//监听
int client=accept(server,NULL,NULL);//接收客户端
char buff[1024];
while(1)
{
int r=recv(client,buff,1023,0);
if(r>0)
{
buff[r]=0;
printf("客户端发来的数据:%s\n",buff);
}
}
return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>//套接字接口
#include<arpa/inet.h>//因特网定义
#include<netinet/in.h>//因特网地址族
int main(int argc,char* argv[])
{
if(argc!=3)printf("请输入IP地址和端口号\n"),exit(0);
int client=socket(AF_INET,SOCK_STREAM,0);//创建套接字
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);//IP地址
addr.sin_port=htons(atoi(argv[2]));//小端转换为大端
connect(client,(struct sockaddr*)&addr,sizeof(addr));
char buff[1024];
while(1)
{
printf("请输入数据:\n");
scanf("%s",buff);
send(client,buff, strlen(buff),0);
sleep(1);
}
return 0;
}
3.UDP协议
UDP是无连接的,不可靠的数据传输
服务器?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?客户端 1. 创建socket?? ??? ??? ??? ??? ??? ??? ??? ?1. 创建socket 2. 确定服务器协议地址簇?? ??? ??? ???2. 获取服务器协议地址簇 3. 绑定 4. 通信?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?3. 通信
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>//套接字接口
#include<arpa/inet.h>//因特网定义
#include<netinet/in.h>//因特网地址族
int main(int argc,char* argv[])
{
if(argc!=3)printf("请输入IP地址和端口号\n"),exit(0);
int server=socket(AF_INET,SOCK_STREAM,0);//创建套接字
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);//IP地址
addr.sin_port=htons(atoi(argv[2]));//小端转换为大端
bind(server,(struct sockaddr*)&addr,sizeof(addr));//绑定
char buff[1024];
while(1)
{
int r=recvfrom(server,buff,1023,0,NULL,NULL);
if(r>0)
{
buff[r]=0;
printf("客户端发来的数据:%s\n",buff);
}
}
return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>//套接字接口
#include<arpa/inet.h>//因特网定义
#include<netinet/in.h>//因特网地址族
int main(int argc,char* argv[])
{
if(argc!=3)printf("请输入IP地址和端口号\n"),exit(0);
int client=socket(AF_INET,SOCK_STREAM,0);//创建套接字
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(argv[1]);//IP地址
addr.sin_port=htons(atoi(argv[2]));//小端转换为大端
char buff[1024];
while(1)
{
printf("请输入数据:\n");
scanf("%s",buff);
sendto(client,buff,strlen(buff),0,(struct sockaddr*)&addr,sizeof(addr));
sleep(1);
}
return 0;
}
|