gpt4 book ai didi

c - TCP/P 套接字阻塞串行连接

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:24 24 4
gpt4 key购买 nike

我有一个程序应该同时读取串行端口和 tcp/ip 套接字。

但是,我只有在通过套接字接收消息时才能看到串口信息。我相信它与 accept() 方法的阻塞/非阻塞有关。但是,我一直未能弄清楚如何向其添加标志。

有人有什么想法吗?

我必须重写整个东西还是可以只添加一个标志?

int main(int argc, char *argv[]) {
int list_s; /* listening socket */
int conn_s; /* connection socket */
short int port; /* port number */
struct sockaddr_in servaddr; /* socket address structure */
char buffer[MAX_LINE]; /* character buffer */
char *endptr; /* for strtol() */


/* Get port number from the command line, and
* set to default port if no arguments were supplied */

if ( argc == 2 ) {
port = strtol(argv[1], &endptr, 0);
if ( *endptr ) {
fprintf(stderr, "ECHOSERV: Invalid port number.\n");
exit(EXIT_FAILURE);
}
}
else if ( argc < 2 ) {
port = ECHO_PORT;
}
else {
fprintf(stderr, "ECHOSERV: Invalid arguments.\n");
exit(EXIT_FAILURE);
}


/* Create the listening socket */

if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
fprintf(stderr, "ECHOSERV: Error creating listening socket.\n");
exit(EXIT_FAILURE);
}


/* Set all bytes in socket address structure to
* zero, and fill in the relevant data members */

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port);


/* Bind our socket addresss to the
* listening socket, and call listen() */

if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {
fprintf(stderr, "ECHOSERV: Error calling bind()\n");
exit(EXIT_FAILURE);
}

if ( listen(list_s, LISTENQ) < 0 ) {
fprintf(stderr, "ECHOSERV: Error calling listen()\n");
exit(EXIT_FAILURE);
}


/* Enter an infinite loop to respond
* to client requests and echo input */
int result = 0;
int portID = -1;
char *device = "/dev/ttyUSB1";
int rate = convertRate("115200");
char parity = convertParity("N");
int databits = convertDatabits("8");
int stopbits = convertStopbits("1");
portID = posixComOpen(device,rate,parity,databits,stopbits);



while ( 1 ) {

char input = 0;

while(posixComDataReady(portID) && posixComRead(portID, &input)) {
printf("%c", input);
} //while

/* Write character to Vex */
if(posixComWrite(portID, 'x') < 0)
printf("POSIX: Error Writing char %c",'x');


/* Wait for a connection, then accept() it */

if ( (conn_s = accept(list_s, NULL, NULL) ) < 0 ) {
fprintf(stderr, "ECHOSERV: Error calling accept()\n");
exit(EXIT_FAILURE);
}



/* Retrieve an input line from the connected socket
* then simply write it back to the same socket. */
Readline(conn_s, buffer, MAX_LINE-1);
printf("Netbook got a TCP/IP message: %s\n", buffer);
char* sendMessage = "Thanks for the message!";
Writeline(conn_s,sendMessage , strlen(sendMessage));




/* Close the connected socket */
if ( close(conn_s) < 0 ) {
fprintf(stderr, "ECHOSERV: Error calling close()\n");
exit(EXIT_FAILURE);
}



}//while

return 0;
}

最佳答案

你是对的,问题是 accept 阻塞,直到有一个新的连接。

我不知道串行连接是如何工作的,但你可能想看看 select 函数,它允许你等待几个不同的文件描述符,并在有数据时响应它们在另一端。

这是一个如何使用套接字选择的例子:Server Example

关于c - TCP/P 套接字阻塞串行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13597341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com