Socket、Tcp、Udp 概念区分
来源:互联网 发布:dnf辅助软件 编辑:程序博客网 时间:2024/06/03 17:31
1.客户端发送一个SYN段(同步序号)指明客户打算连接的服务器端口,以及初始化序号(ISN) 。
2.服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号(ACK)设置为客户的ISN加1以对客户的SYN 报文段进行确认。一个SYN将占用一个序号。
3.客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。
1.TCP提供以认可的方式显式地创建和终止连接。
2.TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
3.TCP处理流控制。
4.允许数据优先
5.如果数据没有传送到,则TCP套接口返回一个出错状态条件。
6.TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道
1.UDP不要求保持一个连接
2.UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销。
3.设计UDP的目的是用于短应用和控制消息
4.在一个数据包连接一个数据包的基础上,UDP要求的网络带宽比TDP更小。
Socket(af,type,protocol)
bind(sockid, local addr, addrlen)
listen( Sockid ,quenlen)
客户端请求连接
Connect(sockid, destaddr, addrlen)
服务器端等待从编号为Sockid的Socket上接收客户连接请求
newsockid=accept(Sockid,Clientaddr, paddrlen)
面向连接:send(sockid, buff, bufflen)
recv( )
面向无连接:sendto(sockid,buff,…,addrlen)
recvfrom( )
close(sockid)
main()
{
int sock_fd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
struct sockaddr_in ser_addr; /* 本机地址信息 */
struct sockaddr_in cli_addr; /* 客户端地址信息 */
char msg[MAX_MSG_SIZE];/* 缓冲区*/
ser_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */
if(ser_sockfd<0)
{/*创建失败 */
fprintf(stderr,"socker Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化服务器地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(SERVER_PORT);
if(bind(ser_sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0)
{ /*绑定失败 */
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
/*侦听客户端请求*/
if(listen(ser_sockfd,BACKLOG)<0)
{
fprintf(stderr,"Listen Error:%s\n",strerror(errno));
close(ser_sockfd);
exit(1);
}
while(1)
{/* 等待接收客户连接请求*/
cli_sockfd=accept(ser_sockfd,(struct sockaddr*) & cli_addr,&addrlen);
if(cli_sockfd<=0)
{
fprintf(stderr,"Accept Error:%s\n",strerror(errno));
}
else
{/*开始服务*/
recv(cli_addr,msg,MAX_MSG_SIZE,0); /* 接受数据*/
printf("received a connection from %sn", inet_ntoa(cli_addr.sin_addr));
printf("%s\n",msg);/*在屏幕上打印出来 */
strcpy(msg,"hi,I am server!");
send(cli_addr,msg,sizeof(msg),0); /*发送的数据*/
close(cli_addr);
}
}
close(ser_sockfd);
}
main()
{
int cli_sockfd;/*客户端SOCKET */
int addrlen;
char seraddr[14];
struct sockaddr_in ser_addr,/* 服务器的地址*/
cli_addr;/* 客户端的地址*/
char msg[MAX_MSG_SIZE];/* 缓冲区*/
GetServerAddr(seraddr);
cli_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */
if(ser_sockfd<0)
{/*创建失败 */
fprintf(stderr,"socker Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化客户端地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
cli_addr.sin_family=AF_INET;
cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
cli_addr.sin_port=0;
if(bind(cli_sockfd,(struct sockaddr*)&cli_addr,addrlen)<0)
{
/*棒定失败 */
fprintf(stderr,"Bind Error:%s\n",strerror(errno));
exit(1);
}
/* 初始化服务器地址*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=inet_addr(seraddr);
ser_addr.sin_port=htons(SERVER_PORT);
if(connect(cli_sockfd,(struct sockaddr*)&ser_addr,&addrlen)!=0)/*请求连接*/
{
/*连接失败 */
fprintf(stderr,"Connect Error:%s\n",strerror(errno));
close(cli_sockfd);
exit(1);
}
strcpy(msg,"hi,I am client!");
send(sockfd,msg,sizeof(msg),0);/*发送数据*/
recv(sockfd,msg,MAX_MSG_SIZE,0); /* 接受数据*/
printf("%s\n",msg);/*在屏幕上打印出来 */
close(cli_sockfd);
}
int main(int argc,char **argv)
{
int ser_sockfd;
int len;
//int addrlen;
socklen_t addrlen;
char seraddr[100];
struct sockaddr_in ser_addr;
/*建立socket*/
ser_sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(ser_sockfd<0)
{
printf("I cannot socket success\n");
return 1;
}
/*填写sockaddr_in 结构*/
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(SERVER_PORT);
/*绑定客户端
if(bind(ser_sockfd,(struct sockaddr *)&ser_addr,addrlen)<0)
{
printf("connect");
return 1;
}
while(1)
{
bzero(seraddr,sizeof(seraddr));
len=recvfrom(ser_sockfd,seraddr,sizeof(seraddr),0,(struct sockaddr*)&ser_addr,&addrlen);
/*显示client端的网络地址*/
printf("receive from %s\n",inet_ntoa(ser_addr.sin_addr));
/*显示客户端发来的字串*/
printf("recevce:%s",seraddr);
/*将字串返回给client端*/
sendto(ser_sockfd,seraddr,len,0,(struct sockaddr*)&ser_addr,addrlen);
}
int GetServerAddr(char * addrname)
{
printf("please input server addr:");
scanf("%s",addrname);
return 1;
}
int main(int argc,char **argv)
{
int cli_sockfd;
int len;
socklen_t addrlen;
char seraddr[14];
struct sockaddr_in cli_addr;
char buffer[256];
GetServerAddr(seraddr);
/* 建立socket*/
cli_sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(cli_sockfd<0)
{
printf("I cannot socket success\n");
return 1;
}
/* 填写sockaddr_in*/
addrlen=sizeof(struct sockaddr_in);
bzero(&cli_addr,addrlen);
cli_addr.sin_family=AF_INET;
cli_addr.sin_addr.s_addr=inet_addr(seraddr);
//cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
cli_addr.sin_port=htons(SERVER_PORT);
bzero(buffer,sizeof(buffer));
/* 从标准输入设备取得字符串*/
len=read(STDIN_FILENO,buffer,sizeof(buffer));
/* 将字符串传送给server端*/
sendto(cli_sockfd,buffer,len,0,(struct sockaddr*)&cli_addr,addrlen);
/* 接收server端返回的字符串*/
len=recvfrom(cli_sockfd,buffer,sizeof(buffer),0,(structsockaddr*)&cli_addr,&addrlen);
//printf("receive from %s\n",inet_ntoa(cli_addr.sin_addr));
printf("receive: %s",buffer);
close(cli_sockfd);
}
CC=gcc
all:server client
CFLAGS=-o
server: server.c
$(CC) $(CFLAGS) $@ server.c
client: client.c
$(CC) $(CFLAGS) $@ client.c
clean:
rm -f server client
- Socket、Tcp、Udp 概念区分
- TCP,HTTP,SOCKET概念区分
- TCP,HTTP,SOCKET概念区分
- TCP/IP、Http、 Socket概念区分
- TCP和UDP概念
- socket,tcp,udp
- TCP-UDP Socket
- TCP UDP Socket流程
- Socket与TCP、UDP
- HTTP、TCP、UDP、Socket
- TCP-UDP Socket
- TCP-UDP Socket
- tcp/udp Socket图解
- TCP-UDP Socket
- UDP、TCP、socket区别
- TCP/IP、UDP、Socket
- UDP、TCP、socket区别
- Socket TCP/UDP
- 选择排序
- Ajax显示当前时间(实现页面局部刷新)
- 2705: [SDOI2012]Longge的问题
- 单调栈
- GDB调试和常见段错误
- Socket、Tcp、Udp 概念区分
- Redis的哈希类型(Hash)
- web体系和tomcat的配置
- GDB的基本使用
- JAVA_SE基础——65.StringBuffer类 ②
- 如何开启远程桌面
- 用C编写的简单程序
- mac 下从设置启动mysql 失败,“Warning:The /usr/local/mysql/data directory is not owned by
- 【Web前端】——轮播