标签: select-function

C,套接字编程:使用select()将多个客户端连接到服务器

我正在尝试制作一个可以由多个客户端连接的服务器.到目前为止,这是我的代码:

客户:

int main(int argc, char **argv) {

  struct sockaddr_in servaddr;
  int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (sock == -1) perror("Socket");

  bzero((void *) &servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(6782);
  servaddr.sin_addr.s_addr = inet_addr(<server_ip_address>);

  if (-1 == connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)))
    perror("Connect");

  while(1) {

    char message[6];
    fgets(message, 6, stdin);

    message[5] = '\0';

    send(sock, message, 6, 0);
  }


  close(sock);
}
Run Code Online (Sandbox Code Playgroud)

服务器:

int main(int argc, char **argv) {

  fd_set fds, readfds;
  int i, clientaddrlen;
  int clientsock[2], rc, numsocks = 0, …
Run Code Online (Sandbox Code Playgroud)

c sockets client network-programming select-function

13
推荐指数
1
解决办法
4万
查看次数

如何使用select()在C中读取键盘输入

我试图使用select()来读取键盘输入,我陷入了困境,我不知道如何从键盘读取并使用文件描述符这样做.我被告知使用STDIN和STDIN_FILENO来解决这个问题,但我仍然感到困惑.
我该怎么做?

c keyboard stdin textinput select-function

9
推荐指数
2
解决办法
2万
查看次数

读取由select()发出信号,但recv()不返回数据,并在非阻塞套接字上发出EAGAIN信号

我有一个用于从select()读取的信号套接字,但是后来没有数据通过recv call()到达,而是返回-1并且errno == EAGAIN.

我可以授予没有其他线程触及套接字.

我认为这种行为是不正确的.如果从其他方面发生后续关闭,我可以期待返回值0(正常关闭)或来自recv的其他错误代码,但不是EAGAIN,因为这意味着我认为数据将来会到达.

我发现这个问题以前的一些线程在这里,但没有解决方案.

在Ubuntu Linux Oneric或其他最新的Linux发行版上发生了这种行为,然后在此处发布链接信息

对于3.0.0内核或最新的2.6.x,它将在内核中修复

有没有人知道它为什么会发生以及如何避免这种不必要的行为?

c sockets recv select-function

6
推荐指数
1
解决办法
5630
查看次数

为什么以下打印'资源暂时不可用'?

为什么以下代码打印'read():资源暂时不可用'80%的时间?这是EAGAIN代码,它与WOULD BLOCK相同,这意味着没有数据等待读取,但是select返回1表示有数据(在Linux中测试):

#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/errno.h>

int main(int argc, char** argv)
{
    int fd = open("/dev/lp0", O_RDWR | O_NONBLOCK);
    int ret = 0;
    int status = 0;
    char buffer[1024];
    char teststr[] = "This is a test\n";
    char XMIT_STATUS_OFFLINE[] = {0x10,0x04,0x02};
    char XMIT_STATUS_ERROR[] = {0x10,0x04,0x03};
    char XMIT_STATUS_ROLL[] = {0x10,0x04,0x04};
    char XMIT_STATUS_SLIP[] = {0x10,0x04,0x05};
    fd_set rfds;
    FD_ZERO( &rfds );
    FD_SET( fd, &rfds );
    struct timeval sleep;
    sleep.tv_sec = 5;
    sleep.tv_usec …
Run Code Online (Sandbox Code Playgroud)

c linux file-io select-function

3
推荐指数
1
解决办法
7127
查看次数

使用睡眠并选择信号

我想使用该select()函数等待1秒,因为我的程序使用信号来控制东西,所以sleep()会过早地返回.奇怪的是,使用select()它时也会过早地返回.

我打电话选择这样的

struct timeval timeout;    
timeout.tv_sec = 10;  
timeout.tv_usec = 1000000; 
select (0 ,NULL, NULL, NULL, &timeout);
Run Code Online (Sandbox Code Playgroud)

但每当信号到达时,它返回(我使用纳秒计时器作为信号)

谁知道为什么?

c sleep signals select-function

3
推荐指数
2
解决办法
4789
查看次数

连接后非阻塞套接字选择返回1

首先,我想说这是另一个问题而不是这个:类似但不一样

我的代码看起来像这样:

struct addrinfo hints, *res;
struct sockaddr* serveraddr;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

int res2 = getaddrinfo(ip, port, &hints, &res);
printf("getaddrinfo() res: %d, %d\n", res2, errno);

serveraddr = res->ai_addr;

//create new socket

int soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
printf("socket() res: %d, %d\n", socket, errno);

//set nonblocking mode
unsigned long on = 1;
res2 = ioctl(soc, FIONBIO, &on);
printf("ioctl() res: %d\n, %d", res2, errno);

res2 = connect(soc, serveraddr, sizeof(struct sockaddr));
printf("connect() res: %d, %d\n", res2, …
Run Code Online (Sandbox Code Playgroud)

c sockets linux nonblocking select-function

2
推荐指数
1
解决办法
2693
查看次数

使用带有阻塞和非阻塞套接字的select的影响

如果我使用带有select()调用的非阻塞套接字而不是使用带有select()调用的阻塞套接字,我的程序将如何在行为上有所不同?

c network-programming nonblocking select-function

2
推荐指数
1
解决办法
6163
查看次数