gpt4 book ai didi

连接到套接字被拒绝

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:18 24 4
gpt4 key购买 nike

我有一个简单的 TCP 服务器程序。在我用 CTRL+C 关闭它并在某些情况下再次重新启动后,telnet 客户端报告我 “连接被拒绝”。为什么它并不总是发生,而只是在某些情况下发生?命令 ps 没有显示任何关于我的程序的信息。

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include<string.h>

void printHex(char *bts);

int main() {
char str[100];
int listen_fd, comm_fd;
struct sockaddr_in servaddr;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
bzero( &servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(22000);
printf("binding\n");
bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

printf("listening\n");
listen(listen_fd, 10);

printf("accepting\n");
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
printf("accep done\n");

int cn = 0;

while(1) {
bzero(str, 100);
printf("will read\n");
int br = read(comm_fd, str, 100);
printf("read done\n");
if (br > 0) {
printHex(str);
} else if (br <= 0) {
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
printf("accep done\n");
}
printf("error %d \n", br);
}
}

void printHex(char *bts) {
char *s = bts;
int i = 0;
do {
printf("%02X ", (unsigned char) *bts);
} while (*++bts !=0);
printf("%s\n",s);
}

最佳答案

您应该检查系统调用的所有返回值:

int res;

res = bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if (res == -1)
// handle error
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (listed_fd == -1)
// handle error

您很可能会发现您的代码在 bind 系统调用上失败,这意味着您不能在相同的 IP 地址、协议(protocol)和端口上重用套接字。您可以使用 setsockopt 调用更改此设置:

// allow to rebind
int reuseaddr_on = 1;
res = setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR,
&reuseaddr_on, sizeof(reuseaddr_on));
if (res < 0)
{
stderr("Setting of SO_REUSEADDR on server's"
"socket failed");
}

您还应该在使用完后关闭套接字。

while(1)
{
// your loop
}
res = close(comm_fd);
if (res == -1)
// handle error

正如 Linux 程序员手册中专门用于千钧一发的页面所说:

NOTES

Not checking the return value of close() is a common but nevertheless serious programming error. It is quite possible that errors on a previous write(2) operation are first reported at the final close(). Not checking the return value when closing the file may lead to silent loss of data.

关于连接到套接字被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34494332/

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