我知道已经回答了相关的问题,但我无法解决我的问题。
我有一个简单的UDP客户端 - 服务器应用程序。客户和客户都是服务器看起来不错,但服务器没有从客户端接收数据包,它只是无限地接收网络ID,192(或者客户端没有正确发送包)。
我似乎无法弄清楚问题,地址&端口都可以,我没有任何防火墙,我甚至为端口添加了一个例外,只是为了确定。如果我启动服务器,我可以看到它在正确的端口(netstat -a -s -p udp)上正常收听。你能不能给我一个关于错误的提示?
这是我的服务器代码:
/*.. includes */
#define PORT 8888
#define NPACK 10
#define MAXLEN 100
void signalError(char* s){
perror(s);
exit(1);
}
int main()
{
struct sockaddr_in struct_srv, struct_client;
int s,i,cod, numbytes;
size_t clientSize;
int32_t nr;
int32_t sir1[MAXLEN], sir2[MAXLEN], sirComune[MAXLEN], nrEl1, nrEl2, nrComune;
//Creating the socket:
s = socket(PF_INET, SOCK_DGRAM, 0);
if(s==-1) signalError("Error while creating socket!");
memset(&struct_srv, 0, sizeof(struct_srv));
struct_srv.sin_family = AF_INET;
struct_srv.sin_addr.s_addr = htonl(INADDR_ANY);
struct_srv.sin_port = htons(PORT);
s = bind(s, (struct sockaddr*) &struct_srv, sizeof(struct_srv));
if(s==-1) signalError("Bind error. Port is already in use!");
//receive packets:
nrEl1 = -1;
char buf[MAXLEN];
printf("Accepting packets:\n");
//for(i=0;i<NPACK;i++) {
for(;;) {
//Receive packets from client:
clientSize = sizeof(struct_client);
numbytes = recvfrom(s, buf, MAXLEN - 1, 0,
(struct sockaddr*) &struct_client, &clientSize);
buf[numbytes] = '\0';
printf("Packet is %d long.\n", numbytes);
printf("Packet contains %s:\n", buf);
sleep(3);
}
close(s);
return 0;
}
我的客户代码:
/* includes */
#define SRV_IP "127.0.0.1"
#define NPACK 100
#define MAXLEN 100
#define PORT 8888
void signalError(char* s){
perror(s);
exit(1);
}
int main(void)
{
struct sockaddr_in struct_client;
int s, i, result, size_client = sizeof(struct_client);
int32_t nr, sir1[MAXLEN], sir2[MAXLEN];
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s==-1) signalError("Erorr creating socket!");
memset((char*) &struct_client, 0, sizeof(struct_client));
struct_client.sin_family = AF_INET;
struct_client.sin_addr.s_addr = htonl(INADDR_ANY);
struct_client.sin_port = htons(PORT);
if(inet_aton(SRV_IP, &struct_client.sin_addr)==0) {
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
char buf[MAXLEN];
int len;
for(i=0;i<NPACK;i++) {
printf("Give packet %d:\n", i+1);
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] = '\0';
printf("I've read %s\n", buf);
printf("Sending packet %d\n", i+1);
result = sendto(s, buf, sizeof(buf)+1, 0,
(struct sockaddr*) &struct_client, size_client);
if(result==-1) signalError("Error sending packets!");
}
close(s);
return 0;
}
答案 0 :(得分:1)
除非我遗漏了一些激烈的东西,否则你只是在这里发送垃圾。
除了评论之外, nr
永远不会在发件人上初始化。
buf
正在初始化,但未在任何地方使用。
您可以尝试将sendto
部分更改为:
result = sendto(s, buf, strlen(buf)+1, 0,
(struct sockaddr*) &struct_client, size_client);
答案 1 :(得分:1)
以下是一些小问题:
size_client = sizeof(struct_client)
之前设置recvfrom
。它既是输入参数又是输出参数,所以你要确保一次调用的输出不会干扰下一次调用的输入。buf
的最后一个字节设置为'\0'
,以防止printf
读取超出边界的内存。cod
?它从哪里来的?我认为你打算测试numbytes
。buf[strlen(buf) - 1] = '\0'
剁掉缓冲区的最后一个字符;那是你想要做的吗?它不起作用的主要原因是:
您从未初始化nr
,因此无法确定sendto正在发送的内容。它肯定不会发送buf
,我认为这就是你想要的......你可能想要这个:
sendto(s, buf, sizeof(buf), ...)
答案 2 :(得分:0)
在您的客户端代码中,通过网络发送的nr
变量未初始化,并且可以指向它想要的任何内容。您可能希望发送buf
数组。