服务器C编程中如何比较客户端发送的数据
我想从客户端向服务器发送一个选项。服务器必须进行一些比较并将字符串发送回客户端。我可以从客户端接收数据,但我的服务器在比较时崩溃(它通过“错误输入”到达else并结束连接)。有人能告诉我我做错了什么吗 Inputclose错误:错误的文件描述符 程序已退出,代码为01 服务器:服务器C编程中如何比较客户端发送的数据,c,strcmp,C,Strcmp,我想从客户端向服务器发送一个选项。服务器必须进行一些比较并将字符串发送回客户端。我可以从客户端接收数据,但我的服务器在比较时崩溃(它通过“错误输入”到达else并结束连接)。有人能告诉我我做错了什么吗 Inputclose错误:错误的文件描述符 程序已退出,代码为01 服务器: void result(int sockfd) { ssize_t n; char buf[MAXLINE]; int temp; time_t
void
result(int sockfd)
{
ssize_t n;
char buf[MAXLINE];
int temp;
time_t ticks;
again:
while ((n =read(sockfd, buf, MAXLINE)> 0))
{
temp = rand() % 22;
if (buf=="A\n" || buf=="a\n")
{
snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24s\r\n", temp,ctime(&ticks));
Writen(sockfd, buf, n);
}
if (buf=="B\n" || buf=="f\")
{
snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24s\r\n", temp,ctime(&ticks));
Writen(sockfd, buf, n);
}
else
{
printf("Incorrect Input");
Close(sockfd);
}
}
if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
err_sys("read error");
}
int
main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t len;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
char recvline[MAXLINE + 1];
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*----------------------------------------------------*/
servaddr.sin_port = htons(5678);
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
printf("EDMTS is running on 129.128.4.80, listening on port 5678\n");
printf("\n");
printf("Waiting for incoming connections...Press Ctrl+C to end server\n");
for ( ; ; )
{
len = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
/*Client connects to server*/
printf("\n");
printf("Connection from %s, port %d\n",
Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
ntohs(cliaddr.sin_port));
result(connfd);
Close(connfd);
printf("Conexion cerrada...Esperando siguiente cliente\n");
}
}
void
结果(int sockfd)
{
(三);
char buf[MAXLINE];
内部温度;
时间滴答;
再一次:
而((n=read(sockfd、buf、MAXLINE)>0))
{
temp=rand()%22;
如果(buf==“A\n”| | buf==“A\n”)
{
snprintf(buf,sizeof(buf),“您的选项是数字是-%i,时间是%.24s\r\n”,temp,ctime(&ticks));
写入(sockfd,buf,n);
}
如果(buf==“B\n”| | buf==“f\”)
{
snprintf(buf,sizeof(buf),“您的选项是数字是-%i,时间是%.24s\r\n”,temp,ctime(&ticks));
写入(sockfd,buf,n);
}
其他的
{
printf(“输入错误”);
关闭(sockfd);
}
}
如果(n<0&&errno==EINTR)
再次转到;
else if(n<0)
错误系统(“读取错误”);
}
int
主(内部argc,字符**argv)
{
int listenfd,connfd;
索克伦;
servaddr、cliaddr中的结构sockaddr\u;
字符buff[MAXLINE];
char recvline[MAXLINE+1];
listenfd=套接字(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY)/*----------------------------------------------------*/
servaddr.sinu port=htons(5678);
绑定(listenfd,(SA*)&servaddr,sizeof(servaddr));
听(listenfd,LISTENQ);
printf(“EDMTS在129.128.4.80上运行,在端口5678上侦听\n”);
printf(“\n”);
printf(“正在等待传入连接…按Ctrl+C以结束服务器\n”);
对于(;;)
{
len=sizeof(cliaddr);
connfd=Accept(listenfd,(SA*)和cliaddr,&len);
/*客户端连接到服务器*/
printf(“\n”);
printf(“从%s连接,端口%d\n”,
Inet_ntop(AF_Inet和cliaddr.sin_addr,buff,sizeof(buff)),
ntohs(cliaddr.sin_港);
结果(connfd);
关闭(connfd);
printf(“cerrada Conexion…Esperando siguiente客户”\n);
}
}
客户
void
get_temp(FILE *fp, int sock)
{
char sendline[MAXLINE], recvline[MAXLINE];
while (Fgets(sendline, MAXLINE, fp) != NULL) {
Writen(sock, sendline, strlen(sendline));
if (Readline(sock, recvline, MAXLINE) == 0)
err_quit("Server Terminated Prematurely");
Fputs(recvline, stdout);
}
}
int
main(int argc, char **argv)
{
int sockfd, n;
socklen_t len;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr, cliaddr;
char scale[2];
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2]));
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);
printf("Connect...\n");
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");
len = sizeof(cliaddr);
Getsockname(sockfd, (SA *) &cliaddr, &len);
printf("Local Address is: %s\n",
Sock_ntop((SA *) &cliaddr, sizeof(cliaddr)));
printf("Enter option A or B): ");
get_temp(stdin, sockfd);
exit(0);
}
void
获取临时文件(文件*fp,int sock)
{
char sendline[MAXLINE],recvline[MAXLINE];
while(Fgets(发送线、MAXLINE、fp)!=NULL){
写入(sock、sendline、strlen(sendline));
if(读线(sock、recvline、MAXLINE)==0)
err_quit(“服务器过早终止”);
FPUT(回收线、标准件);
}
}
int
主(内部argc,字符**argv)
{
int-sockfd,n;
索克伦;
char recvline[MAXLINE+1];
servaddr、cliaddr中的结构sockaddr\u;
煤焦标度[2];
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
err_sys(“套接字错误”);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sinu port=htons(atoi(argv[2]);
如果(inet\u pton(AF\u inet,argv[1],&servaddr.sin\u addr)同时关闭套接字两次。首先:
// void result(int sockfd)
else
{
printf("Incorrect Input");
Close(sockfd); // <<<
}
//无效结果(int sockfd)
其他的
{
printf(“输入错误”);
Close(sockfd);//首先,不能使用==(您将比较指针地址,buf[0]的地址和静态字符串“a\n”的地址肯定不相等。要比较字符串,请使用
发生崩溃的原因是,在调用Close()之后,套接字文件描述符上再次调用read()函数。要删除崩溃,请在Close()之后放置一个break;
,如下所示:
else
{
printf("Incorrect Input");
Close(sockfd);
break;
}
else
{
printf("Incorrect Input");
Close(sockfd);
break;
}