1

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

当从服务器端接受空字符串时,我试图终止程序。我在 Fedora 14 中执行了该程序。我遇到的错误是“SendTo 中的错误”- 非套接字上的套接字。

我无法弄清楚错误。请指出错误。欢迎提出建议。

我已尝试阅读有关此的其他资源,但无法摆脱它。

提前感谢您的回答。

服务器:

#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;
}

如果我可以使用空字符串终止程序,请告诉我。也让我知道程序中的缺陷。再一次感谢你。

4

1 回答 1

0

您正在使用fgets

man fgets

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

因此,当您输入一个空格并按回车键时,您将不会得到" \n"" "正在测试的内容。

于 2013-07-29T20:35:26.293 回答