使用UDP套接字用C回声服务器客户端

问题描述 投票:0回答:1

下面的程序具有从客户机发送数据克到服务器的动机和数据GRAM被回送到客户机,作为确认。

我试图在一个空字符串从服务器端接受终止程序。我执行的程序中的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;

}

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

c networking udp client echo
1个回答
0
投票

您正在使用fgets

man fgets

fgets()至多一个小于从流,并将它们存储大小的字符到缓冲器中读出由s指向。一个EOF或换行后读停止。如果一个换行符被读取,它被保存到缓冲区。

所以,当你输入一个空格,然后按返回,你会得到" \n"不是你的测试" "

© www.soinside.com 2019 - 2024. All rights reserved.