2014-09-29 66 views
-2

請幫忙!這是由於在幾個小時內,我已經沒有運氣瓦特/網上搜索UDP客戶端分段錯誤

CODE:

/* 說明: 客戶應首先發送一個數據包到LocationServer。 LocationServer將監聽主機c-lnx001.engr.uiowa.edu的端口號23510。 此數據報中包含的消息應該是指定的用戶標識(無空字符,空白,換行符或其他無關字符)。 的LocationServer將用含有以下信息的數據報作出響應: [WeatherServer主機名] [WeatherServer端口#] */

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> /* for fprintf */ 
#include <string.h> /* for memcpy */ 
#include <strings.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdlib.h> 

#define SIZE 2048 

INT主(){

struct hostent *hp;  /* host information */ 
struct sockaddr_in servaddr; /* server address */ 
char *my_message = "laura\0";/*USERID as message to server*/ 
char *buf_addr; 
char *host = "c-lnx001.engr.uiowa.edu\0"; 
int port = 23510; 
int fd; 

/* fill in the server's address and data */ 
//memset((char*)&servaddr, 0, sizeof(servaddr)); ? 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(23510); 

/* look up the address of the server given its name */ 
hp = gethostbyname("c-lnx001.engr.uiowa.edu"); 
if (!hp) { 
    fprintf(stderr, "could not obtain address of %s\n", host); 
    return 0; 
} 



/* put the host's address into the server address structure */ 
// DOESN't WORK: memcpy((void *)&servaddr.sin_addr, hp->h_addr_list[0], hp->h_length); 

bcopy(hp->h_addr,(char*)&servaddr.sin_addr,hp->h_length); 

if((fd = socket(AF_INET,SOCK_DGRAM, 0))<0) 
{ 
    exit(2); 

} 

/* send a message to the server */ 
if (sendto(fd, my_message, strlen(my_message), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) 
{ 
    perror("sendto failed"); 
    return 0; 
} 
int addrlen = sizeof(servaddr); 

recvfrom(fd,buf_addr,SIZE,0,(struct sockaddr*)&servaddr,&addrlen); 
printf("%s\n", buf_addr); 

}

+0

char * buf_addr在recvfrom()調用中使用時未初始化。 – 2014-09-29 19:37:53

+0

仔細查看網絡代碼中的所有C'字符串'調用。 C沒有字符串,它有一些字符必須被終止。 – 2014-09-29 19:46:25

+0

哦 - 大膽地錯過了'緊急'的請求 - 有一個downvote。 – 2014-09-29 19:50:50

回答

0

我認爲你的問題是你沒有重置serveraddr
這裏有一個工作副本

#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define IP_ADDRESS "127.0.0.1" 
#define SERVER_PORT 5060 

int main (int argc, char *argv[]) 
{ 
    int recBytes, clientSocket=socket(AF_INET, SOCK_DGRAM, 0); 
    char buf[80], msg[]="greeting to server"; 
    const int msgLen = sizeof(msg); 
    struct sockaddr_in serverAddr; 
    socklen_t reSize; 

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

    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(SERVER_PORT); 
    inet_aton(IP_ADDRESS, &serverAddr.sin_addr); 

    if(sendto(clientSocket, msg, sizeof(msg), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) != (sizeof(msg))) 
    { 
     perror("sendto"); 
     return -1; 
    } 

    reSize = sizeof(struct sockaddr); 
    if((recBytes = recvfrom(clientSocket, buf, sizeof(buf)-1, 0, (struct sockaddr*)&serverAddr, &reSize)) == -1) 
    { 
     perror("recvfrom"); 
     return -1; 
    } 
    buf[recBytes]='\0'; 
    printf("%s\n", buf); 

    return 0; 
} 
+0

網絡代碼中的printf被濫用的幾乎和strlen()一樣多。由OP描述的協議沒有定義終止空值,並且自動存儲char buf [80]未初始化爲空值,recvfrom()調用返回的'recbytes'不用於添加終止空值。如果接收到80字節的數據報,那麼buf可能無法保留添加的空值。 – 2014-09-29 19:44:48

+0

對,更新。 – atlanteh 2014-09-29 19:51:52