网络通信实验
1.1 TCP通信
【实验目的】
熟练掌握tcp服务器与客户端的搭建以及tcp通信的特点。
【实验内容】
本实验通过一个简单的tcp服务器端,接收客户端的连接请求,并发送欢迎信息。
【实验内容】
服务器程序代码:
#include
#include /* See NOTES */
#include
#include
#include
#include
#include
#define backlog 1024
int main(void)
{
int listenfd;
int ret;
struct sockaddr_in addr;
bzero(&addr,sizeof(addr));
addr.sin_family=PF_INET;
addr.sin_port = htons(8888);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
listenfd = socket(PF_INET,SOCK_STREAM,0);
if(listenfd==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
ret = bind(listenfd, (struct sockaddr *)&addr,sizeof(addr));
if(ret==-1)
{
perror("bind");
exit(EXIT_FAILURE);
}
listen(listenfd,backlog);
int connfd = accept(listenfd,NULL,NULL);
printf("connect a client !\n");
char buf[1024];
while(1)
{
// usleep(10);
bzero(buf,sizeof(buf));
ret = recv(connfd,buf,sizeof(buf),0);
if(ret ==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
else if(ret == 0)
{
printf("client quit\n");
break;
}
else
{
printf("recv %d bytes,buf is %s\n",ret,buf);
}
}
close(connfd);
close(listenfd);
return 0;
}
客户端程序代码:
#include
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
int main(void)
{
int client_fd;
int ret;
client_fd = socket(PF_INET,SOCK_STREAM,0);
if(client_fd == -1)
{
perror("socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in sevaddr;
sevaddr.sin_family = PF_INET;
sevaddr.sin_port = htons(8888);
sevaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = connect(client_fd,(struct sockaddr *)&sevaddr,sizeof(sevaddr));
if(ret ==-1)
{
perror("connect");
exit(EXIT_FAILURE);
}
char buf[1024];
strcpy(buf,"hello");
int i;
for(i=0;i<20;i++)
{
send(client_fd,"world",5,0);
send(client_fd,"hello",5,0);
}
close(client_fd);
return 0;
}
【实验步骤】
1. 编译后运行服务器程序与客户端程序,查看结果
2. 修改服务器程序,解开注释(// usleep(10)) 编译后运行,试分析结果,
3. 对于粘包问题,如何解决。
4. 思考题:tcp客户端一次发送40960字节。tcp服务器端一次能接受完吗?发送较大数据的时候应该注意什么问题。
发送大文件时:
1.先发文件大小
2.再发文件数据