资源描述
《网络编程技术》实验报告
得分:
班级
姓名
学号
实验名称
实验二 TCP套接字编程
实验室号
实验目的
掌握单用户客户端跟服务器的连接和数据交互及处理。
实验要求
1. 认真阅读和掌握本实验的相关知识点。
2.上机编写并运行本程序。
3.保存程序的运行结果,并结合程序进行分析。
实验内容
实现一个基于TCP协议的服务器-客户端程序,要求完成以下功能。
客户端:
从命令行读入服务器的IP地址;并连接到服务器;
循环从命令行读入一行字符串,并传递给服务器,由服务器对字符串反转,并将结果返回客户程序,如果用户输入的是quit,则关闭连接;
客户程序显示反转后的字符串;
服务器端:
循环接收客户的连接请求,并显示客户的IP地址和端口号;
接收客户传来的字符串,反转后传递给客户;
实验步骤或源代码
服务器端:
#include<sys/socket.h>
#include<strings.h>
#include<stdio.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<stdlib.h>
#define MAXDATASIZE 100
#define PORT 2345
int main()
{
int sockfd, connfd;
struct sockaddr_in server, server;
struct sockaddr_in client;
socklen_t len;
char buf[MAXDATASIZE];
char sendbuf[MAXDATASIZE];
int i, num,j;
int opt=SO_REUSEADDR;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1)
{
perror("socket() error\n");
exit(1);
}
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(PORT);
if(bind(sockfd, (struct sockaddr *)&server, sizeof(server))==-1)
{
perror("bind() error\n"");
exit(1);
}
if(listen(sockfd,20)==-1)
{
perror("listen() error\n"");
exit(1);
}
while (1)
{
len = sizeof(client);
if((connfd = accept(sockfd, (struct sockaddr *)&client, & len))==-1)
{
perror("accept() error\n"");
exit(1);
}
printf("client IP is %s ,PORT is %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
while (1)
{
If((num=recv(connfd, buf, MAXDATASIZE,0))==-1);
{
Perror(“recv() error!\n”);
Exit(1);
}
printf("recive buf is %s",buf);
for(j=0;j<n;j++)
sendbuf[n-j-2]=buf[j];
send(connfd, sendbuf, n,0);
if (!strcmp(buf,”quit”)) break;
}
close(connfd)
}
close(sockfd);
}
客户端源代码如下:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#define MAXDATASIZE 100
#define PORT 2345
int main(int argc, char *argv[])
{
struct sockaddr_in server;
char buf[MAXDATASIZE];
int sockfd, num;
struct hostent *he;
if (argc != 2)
{
printf(“you must input like this:%s <IP >”,argv[0]):
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL)
{
Perror(“gethostbyname() error!\n”);
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1)
{
Perror(“socket() error!\n”);
exit(1);
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr = *((struct in_addr *)he->h_addr);
server.sin_port = htons(PORT);
if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1)
{
Perror(“connect() error!\n”);
exit(1);
}
while (fgets(buf, MAXDATASIZE, stdin) != NULL)
{
send(sockfd, buf, strlen(buf),0);
if((num=recv(sockfd, buf, MAXDATASIZE,0))==-1)
{
Perror(“recv() error!\n”);
break;
}
else
printf("recv buf is :%s\n" ,buf);
}
close(sockfd);
}
实验结论、心得体会
1.在写客户端时,将清零函数bzero()置于给服务器赋值之前,导致连接出错。
经过仔细检查发现问题所在。
2.写服务器端时,将客户端地址长度len本为 socklen_t定义为Int型,出错。
心得:
虽然书上都有代码,但是还需要自己做适当的调整,变为自己的东西,而且实验时应该细心,否则一点易被忽视的小错误都可能导致整个实验的失败。
展开阅读全文