如何检测TCP套接字断开(使用C Berkeley套接字)

我正在使用循环从交流Berkeley套接字读出消息,但我无法检测套接字何时断开连接,所以我接受新的连接。 请帮忙 while(true) { bzero(buffer,256); n = read(newsockfd,buffer,255); printf(“%s\n”,buffer); }

唤醒线程在accept()调用时被阻塞

Linux上的套接字问题 我有一个在accept()调用时阻塞的工作线程。 它只是等待传入的网络连接,处理它,然后返回监听下一个连接。 当程序退出的时候,我如何发信号通知此网络工作线程(从主线程)从accept()调用返回,同时仍能正常退出其循环并处理其清理代码。 我试过的一些事情: pthread_kill发送信号。 感觉很难做到这一点,加上它不能可靠地允许线程执行它的关闭逻辑。 也使程序终止。 如果可能的话,我想避免发出信号。 pthread_cancel可以。 与上面相同。 这是对线程的严厉杀戮。 那个,线程可能正在做其他事情。 从主线程关闭listen套接字以使accept()中止。 这不可靠。 一些限制: 如果解决方案涉及使监听套接字无阻塞,那很好。 但我不想接受一个解决方案,该解决方案涉及线程每几秒钟通过一次选择呼叫唤醒以检查退出条件。 要退出的线程条件可能与退出的进程无关。 从本质上讲,我想要的逻辑看起来像这样。 void* WorkerThread(void* args) { DoSomeImportantInitialization(); // initialize listen socket and some thread specific stuff while (HasExitConditionBeenSet()==false) { listensize = sizeof(listenaddr); int sock = accept(listensocket, &listenaddr, &listensize); // check if exit condition has been set using […]

为什么数组名称是指向数组第一个元素的指针?

总是这样,我的意思是,数组名称始终是指向数组的第一个元素的指针。为什么它是这样的?它是实现有点事物还是语言特征?

指针算术:++ * ptr或* ptr ++?

我正在学习C语言,并且很困惑++*ptr和*ptr++之间的差异。 例如: int x = 19; int *ptr = &x; 我知道++*ptr和*ptr++产生不同的结果,但我不确定为什么会这样?

sizeof(函数名)返回什么?

示例代码: main () { printf (“size = %d\n”, sizeof (main)); }

fflush(stdin)function不起作用

我似乎无法弄清楚这段代码有什么问题: #include #include #include #include #define MAX 100 #define TRUE 1 #define FALSE 0 char sect_cat; char customer_name[MAX]; char customer_number[MAX]; /* error handling is easier */ int prev_unit = 0; int current_unit = 0; int consumed = 0; int set = FALSE; float init_bill; float tax; float total_bill; void get_userinfo() { printf(“Enter sector category: “); […]

在c中将文本文件读入数组

将文本文件读入动态一维数组的最有效方法是什么? 在每次读取char之后重新分配似乎很愚蠢,在每个读取行之后重新分配似乎不太好。 我想将整个文件读入数组。 你会怎么做?

Windows上最快的屏幕捕获方法

我想为Windows平台编写一个截屏程序,但不确定如何捕获屏幕。 我所知道的唯一方法是使用GDI,但我很好奇是否还有其他方法可以解决这个问题,如果有的话,会产生最少的开销? 速度是一个优先事项。 屏幕录像程序将用于录制游戏镜头,但是,如果这确实缩小了选项范围,我仍然可以接受任何其他超出此范围的建议。 毕竟知识还不错。 编辑 :我遇到过这篇文章: 捕获屏幕的各种方法 。 它向我介绍了Windows Media API的实现方式以及DirectX的实现方式。 它在结论中提到禁用硬件加速可以大大提高捕获应用程序的性能。 我很好奇为什么会这样。 任何人都可以为我填补遗失的空白吗? 编辑 :我读过像Camtasia这样的截屏程序使用他们自己的捕获驱动程序。 有人能给我一个深入的解释它是如何工作的,为什么它更快? 我可能还需要有关实现类似内容的指导,但我确信无论如何都有现有的文档。 另外,我现在知道FRAPS如何记录屏幕。 它挂钩底层图形API以从后台缓冲区读取。 根据我的理解,这比从前端缓冲区读取更快,因为您正在从系统RAM而不是videoRAM中读取数据。 你可以在这里阅读这篇文章。

处理来自recv()TCP的部分返回

我一直在阅读Beej的网络编程指南,以了解TCP连接。 在其中一个示例中,简单TCP流客户端的客户端代码如下所示: if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { perror(“recv”); exit(1); } buf[numbytes] = ‘\0’; printf(“Client: received ‘%s’\n”, buf); close(sockfd); 我将缓冲区设置为小于我发送的总字节数。 我不太确定如何获得其他字节。 我是否必须循环使用recv()直到收到’\0’ ? *关于服务器端的注意事项我也在实现他的sendall()函数,所以它应该实际上是将所有内容发送到客户端。 另见6.1。 指南中的简单流服务器 。

Bubblesort程序与MSVC和TCC的意外输出

我的一个朋友把这个代码发给了我,说它没有按预期工作: #include void main() { int a [10] ={23, 100, 20, 30, 25, 45, 40, 55, 43, 42}; int sizeOfInput = sizeof(a)/sizeof(int); int b, outer, inner, c; printf(“Size is : %d \n”, sizeOfInput); printf(“Values before bubble sort are : \n”); for ( b = 0; b < sizeOfInput; b++) printf(“%d\n”, a[b]); printf(“End of values before […]