2013-03-21 139 views
0

这是客户:UDP客户端/服务器块

int main(int argc, char* argv[]){ 
    int port; 
    int nrb; 
    int flag; 
    int file; 
    struct hostent *host; 
    unsigned int len; 
    char fileName[50]; 
    int sock; 
    char* buffer; 
    int bytesRead; 
    char dest[50]; 
    struct sockaddr_in sv_addr; 
    sscanf(argv[1], "%d", &port); 
    sscanf(argv[2], "%d", &nrb); 
    host=gethostbyname("127.0.0.1"); 
    printf("%d%d", port, nrb); 
    buffer= (char*)malloc(nrb*sizeof(char)); 
    sock= socket(AF_INET,SOCK_DGRAM, 0); 

    memset(&sv_addr,0,sizeof(struct sockaddr_in)); 

    sv_addr.sin_family = AF_INET; 
    sv_addr.sin_port = htons(port); 
    sv_addr.sin_addr= *(struct in_addr*)host->h_addr_list[0]; 

    len= sizeof(sv_addr); 

    printf("File name: "); 
    scanf("%s", fileName); 

    sendto(sock, fileName, sizeof(fileName), 0 , (struct sockaddr*)&sv_addr, len); 
    printf("before recvrom"); 
    recvfrom(sock, &flag, sizeof(int), 0, (struct sockaddr*)&sv_addr,&len); 
    flag= htons(flag); 
    printf("recvfrom1: %d", flag); 
    if(flag==-1){ 
     printf("The file does not exist."); 
     exit(0); 
    } 

    strcpy(dest,"./received/"); 
    strcat(dest, fileName); 

    file=open(dest, O_WRONLY| O_CREAT | O_TRUNC, 0755); 

    do{ 
     bytesRead= recvfrom(sock, buffer, nrb, 0, (struct sockaddr*)&sv_addr, &len); 
     write(file, buffer, bytesRead); 
    }while(bytesRead>0); 

    free(buffer); 
    close(file); 
    close(sock); 

    return 0; 
} 

这是sendto电话后堵,所以也没有“recvfrom的前”打印,但是服务器接收客户端发送的内容,并做了所有东西。 这是服务器:

int main(int argc, char* argv[]){ 
    int port; 
    unsigned int len; 
    int nrb; 
    char fileName[50]; 
    struct sockaddr_in cl_addr; 

    sscanf(argv[1], "%d", &port); 
    sscanf(argv[2], "%d", &nrb); 

    sock=socket(AF_INET, SOCK_DGRAM, 0); 
    memset(&sock_addr, 0, sizeof(sock_addr));\ 

    sock_addr.sin_family= AF_INET; 
    sock_addr.sin_port= htons(port); 
    sock_addr.sin_addr.s_addr=INADDR_ANY; 

    bind(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); 
    len=sizeof(sock_addr); 
    recvfrom(sock, fileName, 256, 0, (struct sockaddr*)&cl_addr,&len); 
    printf("recieved: %s\n", fileName); 
    int readBytes,file, flag; 
    char* buffer; 
    flag=0; 
    file= open(fileName, O_RDONLY); 
    flag=htonl(file); 
    if(sendto(sock, &flag, sizeof(int), 0, (struct sockaddr*)&cl_addr,len)<0){ 
     perror("sendto"); 
    } 
    if(file== -1){ 
     exit(0); 
    } 

    buffer=(char*)malloc(sizeof(char)*nrb); 
    do{ 
     memset(buffer, 0, nrb); 
     readBytes= read(file, buffer, nrb); 
     printf("%s", buffer); 
     sendto(sock, buffer, nrb,0, (struct sockaddr*)&cl_addr, len); 

    }while(readBytes>0); 
    close(file); 
    free(buffer); 
    return 0; 
} 
+1

你确定printf没有被执行吗?标准输出通常会被缓冲,因此即使执行了printf语句,输出可能也不会发生。您可以在printf之后添加对fflush的调用,或者使用调试器单步调试代码,以查看实际发生的情况。 – 2013-03-21 16:30:05

+0

我已经尝试过使用fflush,现在它会打印该消息。所以我想问题是recvfrom调用。你有什么想法吗? – 2013-03-21 16:39:50

+0

请在发布之前先清理您的代码(即缩进) – Wug 2013-03-21 16:49:50

回答

2

那是会被发送256个字节的消息?或更少?虽然recvfrom()“通常”会以较短的消息返回,但不能保证它会。尝试使用MSG_DONTWAIT并处理获取0字节和EWOULDBLOCK情况的情况。

+0

客户端向服务器发送文件名称,所以消息少于256字节。现在服务器将这些东西发送到客户端,客户端接收它,但客户端试图接收一些东西。服务器最终发送0字节,所以服务器停止,但客户端从不接收0字节。 – 2013-03-21 17:25:00

+0

感谢您的帮助,我解决了这个问题。 – 2013-03-21 18:15:45