Tag: 套接字

关闭/清理“混合”文件描述符/套接字

当我使用accept()创建一个套接字并使用fdopen()从中创建一个FILE时,我需要做些什么来清理所有内容? 我需要在套接字上的FILE,shutdown()和close()上执行fclose(),还是只需要shutdown()和/或close()或fclose()? 如果我不做fclose(),我是否必须手动释放()FILE指针?

非阻塞套接字上的select(),recv()和EWOULDBLOCK

我想知道以下情况是否真实?! 非阻塞TCP套接字上的select()(RD)表示套接字已就绪 以下recv()将返回EWOULDBLOCK,尽管调用select()

将套接字绑定到ansi c中的端口80

当我尝试将端口80绑定到c中的套接字时,我总是得到错误,我没有权限使用此端口。 获得此许可有简单的方法吗?

sockets上的fread停止但fget没有?

我正在使用c中的代理服务器。 我已经在不同的地方使用了fread和fgets的组合,但是想要调和并理解其中的差异。 在下面的例子中,我试图在我以前成功使用fget的地方使用fread。 相反,我的服务器现在挂在fread线上。 有什么区别,为什么我的程序挂起? void HandleTCPClient(int clntSocket) { FILE *request = fdopen(clntSocket, “r”); char reader[2000]; size_t q; //typo before while((q=fread(reader, 1, sizeof(reader), request))>0) { //hangs here! printf(“i read something!\n”); } return; } 谢谢!! 编辑:所以,如果我使行“while((q = fread(读者,1,1,请求))> 0){” 我在屏幕上看到“我读了些东西”…… 不确定这意味着什么。 因此,如果流中至少存在缓冲区的大小字符数,那么fread将无法正常执行任何操作是正确的吗?

Android VpnService保护存储在本机代码中的套接字?

我正在编写VPN应用程序,用于VPN连接的套接字是在我的本机C代码中处理的,而不是在java中处理的。 如何在该套接字上使用VpnService.protect() ? 我注意到它有一个VpnService.protect(int)重载,我可以返回socket从本机代码返回到Java的int并以这种方式保护它吗? 例 // Native Code int socket; JNIEXPORT jint JNICALL Java_com_my_package_Class_initializeSocket ( JNIEnv *env, jobject jobj ) { socket = socket(AF_INET, SOCK_DGRAM, 0); // . . . Handler other socket preparations return (jint)socket; } // Java Code public native int initializeSocket(); . . . int socket = initializeSocket(); this.protect(socket); 编辑 我确实找到了这个描述protectfunction如何工作的问题,看起来它可能在C中有一个非常简单的实现,因为看起来它只是使用了setsockopt调用。 但我对C也比较陌生,所以我不能完全遵循如何复制它。

sockets之间的管道

我有一个充当镜像的C ++服务器。 什么进入了一个不同的sockets。 现在,它将套接字读入缓冲区并将其写入另一个套接字。 我想提高吞吐量。 我已经读过有关sendfile()和splice() ,但它似乎仅限于“文件到套接字”传输。 也许套接字之间的简单pipe()可以工作。 您有什么推荐的吗? 便携式解决方案将是完美的,但如果它只是Linux,那就没问题了。

尝试在c中实现并发TCP服务器和客户端

我已经使用线程和分支在c中实现了TCp并发服务器和客户端。 但我没有办法检查是否有任何其他标准方法来实现这一点。 我已经为标准编码的东西搞砸了,但没有找到任何有用的东西。 有人可以共享一些好的链接或代码,这样我就可以有一个标准的实现并发服务器的想法。 感谢帮助

客户端无法绑定到给定端口并连接到给定服务器

我需要我的客户端绑定到特定端口,然后连接到其服务器。 问题是如果我成功绑定到给定端口但无法连接到服务器。 如果我不尝试绑定到端口,我可以连接到服务器。 以下是我的计划: int main() { int sock, bytes_recieved; char send_data[1024],recv_data[1024]; struct hostent *host; struct sockaddr_in server_addr,client_addr; host = gethostbyname(“127.0.0.1”); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror(“Socket”); exit(1); } client_addr.sin_family = AF_INET; client_addr.sin_port = htons(4000); client_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(client_addr.sin_zero),8); //host = gethostbyname(“192.168.61.67”); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(2404); server_addr.sin_addr […]

在socket中发送多个send / recv

我需要在套接字程序中使用多个send / recv进行一些澄清。 我的客户端程序如下所示(使用TCP SOCK_STREAM)。 send(sockfd,”Messgfromlient”,15,0); send(sockfd,”cli1″,5,0); send(sockfd,”cli2″,5,0); send(sockfd,”cli3″,5,0); send(sockfd,”cli4″,5,0); send(sockfd,”cli5″,5,0); 服务器程序如下所示。 recv(newsockfd,buf,20,0); printf(“Buffer is %s\n”,buf); 当我执行上面的程序时,输出如下: 客户端消息:Messgfromlient 我相信buf大小是20,所以只收到一个缓冲区。 在服务器端添加一个recv。 char buf[20],buf[20]; ——skipped—— recv(newsockfd,buf,20,0); recv(newsockfd,buf1,20,0); printf(“Client Msg :%s\n”,buf); printf(“Client Msg :%s \n”,buf1); 输出:第一次试用: Client Msg :Messgfromlient Client Msg :cli2 第二道: Client Msg :Messgfromlient Client Msg :cli1 我们可以看到输出中存在一些矛盾,从客户端来看它看起来所有的msg都被发送了,但是在服务器中,将根据buf大小接收msg,这里虽然buf1的大小为20,为什么’cli3’在buf1上没有收到’cli4”cli4’msgs? 那有什么特别的限制吗? 请澄清一下。 Raja,先谢谢你

如何在C中创建UDP服务器?

我正在尝试用C编写UDP服务器(在Linux下)。 我知道在socket()函数中我必须使用SOCK_DGRAM而不是SOCK_STREAM 。 if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) { fprintf(stderr, "ERROR"); } 但是现在,当我尝试运行程序时(编译时没有错误),它表示listen()中存在错误。 这是对它的调用: if (listen(list_s, 5) < 0) { fprintf(stderr, "ERROR IN LISTEN"); exit(EXIT_FAILURE); } 你能弄明白问题是什么吗? 这是代码: int list_s; /* listening socket */ int conn_s; /* connection socket */ short int port; /* port number */ struct sockaddr_in servaddr; […]