练习
编写客户端与服务器的代码解决 tcp 粘包问题
编写客户端与服务器的代码解决 tcp 粘包问题
登录后即可发布作业,立即登录
全部作业 61
#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;
int length;
int receve_total;
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(;;){
length = 0;
receve_total = 0;
//接收数据的长度
rbytes = recv(cfd,&length,4,0);
if (rbytes == -1){
perror("[ERROR] Failed to recv.");
exit(EXIT_FAILURE);
}
for(;;){
rbytes = recv(cfd,buffer + receve_total,length - receve_total,0);
if (rbytes == -1){
perror("[ERROR] Failed to recv.");
exit(EXIT_FAILURE);
}else if (rbytes == 0){
printf("The client has been shutdown.\n");
}else if (rbytes > 0){
receve_total += rbytes;
if (receve_total == length)
break;
}
}
printf("buffer : %s\n",buffer);
sleep(1);
}
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;
socklen_t length;
char sbuffer[1024] = "hello,world";
char *pbuffer = NULL;
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(;;){
length = strlen(sbuffer); // 计算发送数据的长度
pbuffer = (char *)malloc(length + 4); // 分配空间,包含长度空间 与数据空间
memcpy(pbuffer,&length,4); //拷贝长度到缓冲区中
memcpy(pbuffer + 4,sbuffer,length); // 拷贝数据到缓冲区中
sbytes = send(sfd,pbuffer,length + 4,0); // 发送数据给服务器
if (ret == -1){
perror("[ERROR] Failed to send.");
exit(EXIT_FAILURE);
}
usleep(100);
}
close(sfd);
return 0;
}