2016-11-07 74 views
0

因此,我試圖在Linux中使用UDP和C構建基本的服務器和客戶端。服務器必須從客戶端接收兩個char數組(緩衝區和輔助數據),並且客戶端必須從服務器接收一個int數組,該數組將包含aux中給出的字符位於緩衝區數組中的位置(例如,如果我們有aaabaa和a aux,客戶必須打印01245)。問題是客戶端總是打印00000等,這取決於frecv數組的長度。UDP客戶端沒有收到來自服務器的任何東西C

這裏是我的代碼:

//客戶

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netinet/ip.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <stdint.h> 

int main(int argc, char *argv[]) 
{ 

int clientSocket, portNum, nBytes1,portno,nBytes2,nBytes3,i; 
int32_t frecv[1024],frecv2[1024]; 
char buffer[1024],aux[2]; 
struct sockaddr_in serverAddr; 
socklen_t addr_size; 
struct hostent *server1; 

clientSocket = socket(PF_INET, SOCK_DGRAM, 0); 
portno=atoi(argv[2]); 
server1 = gethostbyname(argv[1]); 
serverAddr.sin_family = AF_INET; 
serverAddr.sin_port = htons(portno); 
bcopy((char *)server1->h_addr, (char *)&serverAddr.sin_addr.s_addr,server1->h_length);; 
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

addr_size = sizeof serverAddr; 

while(1) 
{ 
    printf("Introdu un sir de caractere:\n"); 
    fgets(buffer,1024,stdin); 
    printf("You typed: %s\n",buffer); 

    printf("Introdu un caracter:\n"); 
    fgets(aux,2,stdin); 
    printf("You typed: %s\n",buffer); 
    printf("You typed: %s\n",aux); 

    nBytes1 = strlen(buffer) + 1; 
    nBytes2 = strlen(aux) + 1; 
    sendto(clientSocket,buffer,nBytes1,0,(struct sockaddr *)&serverAddr,addr_size); 
    sendto(clientSocket,aux,nBytes2,0,(struct sockaddr *)&serverAddr,addr_size); 

    nBytes3 = recvfrom(clientSocket,frecv2,1024,0,(struct sockaddr *)&serverAddr,&addr_size); 
    for (i = 0 ; i < nBytes3 ; i++) 
     frecv[i] = ntohl(frecv2[i]); 
    for (i=0;i<nBytes3;i++) 
     printf("%d",frecv[i]); 
    printf("\n"); 
    return 0; 
} 


} 

//服務器

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netinet/ip.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <stdint.h> 

int main(int argc, char *argv[]) 
{ 
int udpSocket,portno,l; 
char buffer[1024]; 
char aux[2]; 
struct sockaddr_in serverAddr,client; 
socklen_t addr_size; 
int i; 

udpSocket = socket(AF_INET, SOCK_DGRAM, 0); 
if (udpSocket < 0) 
{ 
    printf("Eroare la crearea socketului server\n"); 
    return 1; 
} 
memset(&serverAddr, 0, sizeof(serverAddr)); 
portno=atoi(argv[1]); 
serverAddr.sin_port = htons(portno); 
serverAddr.sin_family = AF_INET; 
serverAddr.sin_addr.s_addr = INADDR_ANY; 


if (bind(udpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) 
{ 
    perror ("Eroare la bind"); 
    exit (1); 
} 
else 
    printf ("Bind successful\n"); 

l = sizeof(client); 
memset(&client, 0, sizeof(client)); 

while(1) 
{ 
    int nBytes1,nBytes2,j; 
    int32_t frecv[1024],frecv2[1024]; 
    nBytes1 = recvfrom(udpSocket,buffer,1024,0,(struct sockaddr *)&client, &l); 
    nBytes2 = recvfrom(udpSocket,aux,2,0,(struct sockaddr *)&client, &l); 

    printf("You typed: %s\n",buffer); 
    printf("You typed: %s\n",aux); 
    printf("You typed: %d\n",nBytes1); 
    printf("You typed: %d\n",nBytes2); 

    for(i=0;i<nBytes1-1;i++) 
     if (buffer[i]==aux[0]) 
     { 
      frecv[j]=i; 
      j++; 
     } 
    for(i=0;i<j;i++) 
     printf("%d",frecv[i]); 
    for (i = 0 ; i < j ; i++) 
     frecv2[i] = htonl(frecv[i]); 
    printf("\n"); 
    sendto(udpSocket,frecv2,j,0,(struct sockaddr *)&client,l); 
    printf("Done\n"); 
} 

return 0; 
} 

回答

2

,你已經開關於要發送的數據量/接收時,服務器響應。

在服務器:

sendto(udpSocket,frecv2,j,0,(struct sockaddr *)&client,l); 

你不想送j字節。你想發送j類型的元素int32_t。所以你需要乘以元素大小。

sendto(udpSocket,frecv2,j*sizeof(frecv2[0]),0,(struct sockaddr *)&client,l); 

同樣在客戶端:

for (i = 0 ; i < nBytes3 ; i++) 
    frecv[i] = ntohl(frecv2[i]); 
for (i=0;i<nBytes3;i++) 
    printf("%d",frecv[i]); 

你讀nBytes3,但每個元素都是一個int32_t的大小,而不是1個字節。所以除以元素大小:

for (i = 0 ; i < nBytes3/sizeof(frecv2[0]) ; i++) 
    frecv[i] = ntohl(frecv2[i]); 
for (i=0;i<nBytes3/sizeof(frecv2[0]);i++) 
    printf("%d",frecv[i]); 

在服務器中還有一件事。您無法初始化j。將其設置爲循環頂部的0。

+0

非常感謝。這解決了一切。 – Artyomska

相關問題