2014-09-29 79 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