/* SEND FUNC. */
int mysend(unsigned char *buffer, int len) {
int sock,ret;
int status,flags;
struct sockaddr_in6 servaddr;
int opt = 1;
char *addr = "1101::1";
sock = socket(AF_INET6,SOCK_DGRAM,0);
if (sock < 0)
return -1;
if( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0 )
return -1;
flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags|O_NONBLOCK);
servaddr.sin6_family = AF_INET6;
servaddr.sin6_port = htons(61616);
status = inet_pton(AF_INET6, addr, &servaddr.sin6_addr);
if (status <= 0) {
perror("inet_pton");
return -1;
}
/* send message to server */
status = sendto(sock, buffer, len, 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (status < 0) {
perror("sendto");
return -1;
}
close(sock);
printf("MESSAGE SENT SUCCESSFULLY\n");
return 0;
}
/* RECEIVE FUNC. */
int myrcv() {
int sock,ret;
int status,len,rx_bytes;
int timeout,nfds =1;
struct sockaddr_in6 servaddr;
struct timeval wait;
unsigned char rxbuff[1024];
char *rcv;
char *addr = "1101::1";
fd_set rd;
struct pollfd *fds;
sock = socket(AF_INET6,SOCK_DGRAM,0);
if (sock < 0)
return -1;
servaddr.sin6_family = AF_INET6;
servaddr.sin6_port = htons(61616);
status = inet_pton(AF_INET6, addr, &servaddr.sin6_addr);
if (status <= 0)
return -1;
bind(sock,(struct sockaddr *)&servaddr,sizeof(servaddr));
timeout = (1* 1000);
wait.tv_sec = 10;
wait.tv_usec = 0;
len = sizeof(servaddr);
fds->fd = sock;
fds->events = POLLIN;
for(;;) {
//FD_ZERO(&rd);
//FD_SET(sock,&rd);
printf("Waiting for data....\n");
ret = poll(fds,nfds,timeout);
//ret = select(1,&rd,NULL,NULL,&wait);
if(ret < 0)
break;
if(fds->revents == 0)
printf("revents 0 %d\n",ret);
if(ret == 0)
continue;
memset(rxbuff,0,1024);
//if(FD_ISSET(sock,&rd)) {
printf("receiving message\n");
rx_bytes = recvfrom(sock,rxbuff,1024,0,(struct sockaddr *)&servaddr,&len);
memcpy(rcv,rxbuff,rx_bytes);
//}
}
close(sock);
return 0;
}
int main()
{
/* call mysend() periodically using sigaction() */
/* create a thread that continuously monitors(calls myrcv()) for incoming data */
return 0;
}
我无法从服务器接收数据包,但我可以在tcpdump输出中看到数据包。以上是示例客户端代码片段,它尝试从/向服务器接收和发送数据。方案是:客户端需要定期向服务器发送数据,并且还应该能够从服务器接收任何数据。 我已尝试使用poll和select方法但未能收到。如果我遗漏任何东西,请告诉我。感谢您的支持。
答案 0 :(得分:1)
您收到的问题是您需要bind
接收套接字到本地端口。
您还可以改进其他内容,例如为发送套接字发送和接收和使用SO_REUSEADDR
创建单个套接字(在只写套接字上不需要) )。
你应该做的是:
IN6ADDR_ANY_INIT
绑定到所有接口)答案 1 :(得分:0)
有几件事:
您的接收函数(myrcv)未通过bind()调用指定侦听端口。这是最可能的问题。同上为您的发送功能,虽然为您随机选择了一个端口。
在你的myrcv()函数中,我没有看到你在调用poll()之前实际初始化fds或nfsd的位置。
每次调用mysend()时重新打开和关闭套接字都会出现问题。如果您希望服务器在同一端口上发送回同一客户端,它会收到消息,很可能您已经关闭了套接字。你应该只为发送和接收打开一个套接字。您可以在发送线程和接收线程之间共享相同的套接字。