網絡通信實驗
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.再發文件數據