【发布时间】:2015-12-28 13:20:51
【问题描述】:
我有简单的 TCP 服务器程序。在我用CTRL+C 关闭它并在某些情况下再次重新启动后,telnet 客户端向我报告"connection refused"。为什么它并不总是发生,而只是在某些情况下发生?命令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);
}
【问题讨论】:
-
您的代码中没有错误检查。也许这将是一个开始?
-
补充@Roddy 所说的:你怎么知道你对
bind()或listen()的调用有效? -
OT: "
do ... while (*++bts !=0);": 你不能依赖read()读取0,至少只要客户端不只有 发送0s。在套接字上调用read()可能会返回介于 1 和第三个参数指定的最大值之间的任意字节数。 -
关闭打开的套接字,清理是必不可少的。抓住中断这样做。
-
添加到@alk 的评论;
printHex应该采用字节计数参数来告诉它要转储多少字节,而不是依赖缓冲区中的零终止符。