C UDP客户端分段错误
请帮忙!这将在几个小时内到期,但我在网上搜索时运气不佳 代码: /* 说明: 客户端应首先向LocationServer发送数据报。 LocationServer将侦听主机c-lnx001.engr.uiowa.edu的端口号23510。 此数据报中包含的消息应为指定的UserID,不包含空字符、空格、换行符或其他无关字符。 LocationServer将使用包含以下信息的数据报进行响应: [WeatherServer主机名][WeatherServer端口] */ int main{C UDP客户端分段错误,c,segmentation-fault,client-server,C,Segmentation Fault,Client Server,请帮忙!这将在几个小时内到期,但我在网上搜索时运气不佳 代码: /* 说明: 客户端应首先向LocationServer发送数据报。 LocationServer将侦听主机c-lnx001.engr.uiowa.edu的端口号23510。 此数据报中包含的消息应为指定的UserID,不包含空字符、空格、换行符或其他无关字符。 LocationServer将使用包含以下信息的数据报进行响应: [WeatherServer主机名][WeatherServer端口] */ int main{ stru
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);
}我认为您的问题在于没有重置serveraddr 这是一份工作副本
char*buf_addr在recvfrom调用中使用时未初始化。请仔细查看网络代码中的所有C'string'调用。C没有字符串,它有大量必须以nul结尾的字符。哦,没有用粗体显示“紧急”请求,请投反对票。此外,谷歌搜索“C UDP客户端”显示:“大约4670000个结果”,其中第一个是一个合理的例子。请注意,recvfrom后面加了一个终止null网络代码中的printf和strlen一样被滥用。OP描述的协议未定义终止null,自动存储字符buf[80]未初始化为null,并且recvfrom调用返回的“recbytes”未用于添加终止null。如果接收到80字节的数据报,buf可能无论如何都不会保留添加的null。
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);
#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;
}