Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 客户端套接字无法使用轮询/选择接收数据_C_Linux_Sockets_Client Server - Fatal编程技术网

C 客户端套接字无法使用轮询/选择接收数据

C 客户端套接字无法使用轮询/选择接收数据,c,linux,sockets,client-server,C,Linux,Sockets,Client Server,我无法从服务器接收数据包,但我可以在tcpdump输出中看到数据包。上面是示例客户机代码段,它尝试从服务器接收数据并将数据发送到服务器。该场景是:客户端需要定期向服务器发送数据,并且还应该能够从服务器接收任何数据。 我尝试使用poll和select两种方法,但未能收到。如果我遗漏了什么,请告诉我。感谢您的支持。接收的问题是需要将接收套接字绑定到本地端口 您还有其他可以改进的地方,比如为发送和接收创建一个套接字,并在发送套接字上使用SO_REUSEADDR,而在只写套接字上则不需要 你应该做的是:

我无法从服务器接收数据包,但我可以在tcpdump输出中看到数据包。上面是示例客户机代码段,它尝试从服务器接收数据并将数据发送到服务器。该场景是:客户端需要定期向服务器发送数据,并且还应该能够从服务器接收任何数据。
我尝试使用poll和select两种方法,但未能收到。如果我遗漏了什么,请告诉我。感谢您的支持。

接收的问题是需要将接收套接字绑定到本地端口

您还有其他可以改进的地方,比如为发送和接收创建一个套接字,并在发送套接字上使用SO_REUSEADDR,而在只写套接字上则不需要

你应该做的是:

创建套接字 设置套接字选项 绑定到本地地址使用IN6ADDR\u ANY\u INIT绑定到所有接口 写入服务器 投票答辩 有几件事:

接收函数myrcv未通过绑定调用指定侦听端口。这是最可能的问题。发送函数也是如此,不过随机选择了一个端口

在myrcv函数中,我看不出在调用poll之前在哪里初始化了fds或nfsd

在每次调用mysend时重新打开和关闭套接字看起来都有问题。如果您希望服务器在接收消息的同一端口将消息发送回同一客户机,那么很可能您已经关闭了套接字。您应该只打开一个用于发送和接收的套接字。您可以在发送线程和接收线程之间共享同一个套接字


谢谢你的回复。1:尝试添加绑定,但仍然无法接收数据。2:初始化fds->fd=sock;nfds=1 3:是的,我没有定期给mysend打电话,只是打了一次电话,检查myrcv是否从服务器收到任何数据。但是没有收到。谢谢你的回复。我已经尝试绑定套接字,但仍然没有收到数据。另外,我已经将套接字设置为SO_REUSEADDR。关于调试这个问题还有其他想法吗?谢谢。@foo_-l可能是你接收的速度太慢了。在发送到服务器之前,请尝试创建接收套接字和绑定。或者将一个绑定套接字用于发送和接收。立即工作。。正如所建议的,第一个创建的rcv套接字和发送到服务器不起作用,但添加了sleep1;在创建recv线程和发送之间有效..不确定确切原因。。谢谢你的回复。
/* 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;
}