练习
1.理解 tcp 粘包的原因
2.编写代码验证tcp粘包
1.理解 tcp 粘包的原因
2.编写代码验证tcp粘包
登录后即可发布作业,立即登录
我的作业
全部作业 62
主要原因是 TCP 协议在底层是字节流,并不关注,应用层的消息边界。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define LISTEN_SZ 10
int main(int argc,char *argv[])
{
if (argc != 3){
fprintf(stderr,"usage : %s < ip > < port >.\n",argv[0]);
exit(EXIT_FAILURE);
}
int sfd,ret,cfd;
struct sockaddr_in svr_addr,cli_addr;
ssize_t sbytes,rbytes;
char buffer[1024] = {0};
sfd = socket(AF_INET,SOCK_STREAM,0);
if (sfd == -1){
perror("[ERROR] socket(): ");
exit(EXIT_FAILURE);
}
bzero(&svr_addr,sizeof(struct sockaddr_in));
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons(atoi(argv[2]));
svr_addr.sin_addr.s_addr = inet_addr(argv[1]);
ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in));
if (ret == -1){
perror("[ERROR] bind(): ");
close(sfd);
exit(EXIT_FAILURE);
}
ret = listen(sfd,LISTEN_SZ);
if (ret == -1){
perror("[ERROR] listen(): ");
close(sfd);
exit(EXIT_FAILURE);
}
socklen_t len = sizeof(struct sockaddr_in);
bzero(&cli_addr,sizeof(struct sockaddr));
cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len);
if (cfd == -1){
perror("[ERROR] accept(): ");
exit(EXIT_FAILURE);
}
printf("ip : %s,port : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
for(;;) {
memset(buffer,sizeof(buffer),0);
rbytes = recv(cfd,buffer,sizeof(buffer),0);
if (rbytes == -1){
perror("recv(): ");
exit(EXIT_FAILURE);
}else if (rbytes == 0){
printf("The client is offline.\n");
exit(EXIT_FAILURE);
}else if (rbytes > 0){
printf(" %s\n",buffer);
}
sleep(1);// 服务器间隔 1s 接收一次数据
}
close(cfd);
close(sfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int main(int argc,char *argv[])
{
int sfd,ret;
ssize_t sbytes = 0,rbytes = 0;
char sbuffer[1024] = {0};
char rbuffer[1024] = {0};
struct sockaddr_in svr_addr;
if (argc != 3){
fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]);
return -1;
}
sfd = socket(AF_INET,SOCK_STREAM,0);
if (sfd == -1){
perror("[ERROR] socket(): ");
exit(EXIT_FAILURE);
}
printf("sfd = %d\n",sfd);
bzero(&svr_addr,sizeof(svr_addr));
svr_addr.sin_family = AF_INET;
svr_addr.sin_port = htons(atoi(argv[2]));
svr_addr.sin_addr.s_addr = inet_addr(argv[1]);
ret = connect(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr));
if (ret == -1){
perror("[ERROR] connect():");
exit(EXIT_FAILURE);
}
for(;;){
strcpy(sbuffer,"hello,abcde");
sbytes = send (sfd,sbuffer,strlen(sbuffer),0);
if (sbytes == -1){
perror("[ERROR] send(): ");
exit(EXIT_FAILURE);
}
usleep(100);
}
close(sfd);
return 0;
}