gpt4 book ai didi

c - 在 C 中使用 UDP 套接字的 Echo 服务器客户端

转载 作者:行者123 更新时间:2023-11-30 17:49:19 25 4
gpt4 key购买 nike

以下程序的目的是从客户端向服务器发送数据报,并将数据报回显给客户端作为确认。

我试图在出现空字符串时终止程序 从服务器端接受。 我在 Fedora 14 中执行了该程序。 我遇到的错误是有一个“Error in SendTo”- Socket on 非套接字。

我无法找出错误。错误之处还请大家指出。欢迎提出建议。

我曾尝试阅读与此相关的其他资源,但未能成功。

预先感谢您的回答。

服务器:

#include<stdio.h> 
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#define PORT 7844

int main(int argc,char *argv[]) {
char buf[2000];
int sockfd,len,a;
struct sockaddr_in servaddr,cliaddr;
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf("Error creating socket\n");
exit(0);
}
printf("UDP Server Socket Created Successfully.\n");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(PORT);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
{
perror("Error binding socket.");
exit(0);
}
printf("UDP Server Socket Binded.\n");
len=sizeof(cliaddr);
do {
strcpy(buf," ");
if((a=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len))<0){
perror("ERROR");
exit(0);
}
printf("From Client : %s",buf);
if((sendto(sockfd,buf,a,0,(struct sockaddr *)&cliaddr,len))<0)
{
perror("NOTHING SENT");
exit(0);
}
printf("Server : ");
fgets(buf,sizeof(buf),stdin);
if((sendto(sockfd,buf,a,0,(struct sockaddr *)&cliaddr,len))<0)
{
perror("NOTHING SENT");
exit(0);
}
} while(strcmp(buf," ")!=0);
close(sockfd);
return 0;
}

客户端

#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#define PORT 7844

int main(int argc,char *argv[]) {
int sockfd,len;
struct sockaddr_in serv,cliaddr;
char buff[2000];
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
perror("ERROR creating socket");
exit(0);
}
printf("UDP Client Socket Created Successfully.\n");
memset(&serv,0,sizeof(serv));
serv.sin_family=AF_INET;
serv.sin_port=htons(PORT);
serv.sin_addr.s_addr=inet_addr(argv[1]);
do
{
printf("Client : ");
fgets(buff,sizeof(buff),stdin);
if((sendto(sockfd,buff,sizeof(buff),0,(struct sockaddr *)&serv,sizeof(serv)))<0) {
perror("ERROR IN SENDTO");
}
if(strcmp(buff," ")==0) {
exit(0);
}
strcpy(buff," ");
if((recvfrom(sockfd,buff,sizeof(buff),0,(struct sockaddr *)&cliaddr,&len))<0) {
perror("ERROR IN RECVFROM");
exit(0);
}
fputs("From Server : ",stdout);
fputs(buff,stdout);

} while(strcmp(buff," ")!=0);
close(sockfd);
return 0;
}

请告诉我是否可以使用空字符串终止程序。还请让我知道程序中的缺陷。再次感谢您。

最佳答案

您正在使用fgets

来自man fgets

fgets() 从流中最多读入一个小于 size 的字符并将它们存储到 s 指向的缓冲区中。之后停止读取 EOF 或换行符。如果读取换行符,则会将其存储到缓冲区中。

因此,当您输入空格并按回车键时,您将得到 "\n" 而不是您正在测试的 ""

关于c - 在 C 中使用 UDP 套接字的 Echo 服务器客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com