Tag: 套接字

本地主机服务器套接字程序不起作用

我有用C编写的服务器和客户端套接字程序。我想使用local host ipaddress 127.0.0.1将客户端程序与我的笔记本电脑上的服务器程序连接。 当我执行服务器程序。 它的输出绑定失败并停止。 如何使客户端连接到同一台笔记本电脑上的服务器,即通过本地主机。 请帮忙。 这是服务器代码(这是一个echo服务器程序): #include #include #include #include #include #include main(int argc, char *argv[]) { int clilen, sockfd, newsockfd, n, cpid; char msg[100]; struct sockaddr_in serv_addr, cli; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("socket failed to establish\n"); exit(0); } printf("socket created\n"); bzero((char *)&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; […]

在c中使用套接字重新连接

即时通讯在c中使用socket并在send / recv上获得成功。 然而,问题是当我的服务器崩溃时,客户端必须重新连接服务器(服务器运行一段时间后)。 所以我在这做了什么: 创建一个套接字 连 的recv /发 如果recv size == 0,请转到第2步。 这个算法不适合我。 有什么想法吗? 码: int initSocket(char *servIP, unsigned short serverPort) { portNum = serverPort; ipAddr = servIP; /* Socket descriptor */ struct sockaddr_in echoServAddr; /* Echo server address */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { printf("socket() failed"); bConnected = -1; […]

限制C标准I / O以及为什么我们不能将C标准I / O与套接字一起使用

我最近正在阅读CSAPP。 在第10.9节中,它说标准I / O不应该与套接字一起使用,原因如下: (1)标准I / O的限制 限制1:输出function后的输入function。 如果没有对fflush,fseek,fsetpos或倒带的干预调用,输入function将无法跟随输出function。 fflush函数清空与流关联的缓冲区。 后三个函数使用Unix I / O lseek函数来重置当前文件位置。 限制2:输入function后的输出function。 除非输入函数遇到文件结尾,否则输出函数无法在没有对fseek,fsetpos或rewind进行干预调用的情况下跟随输入函数。 (2)在套接字上使用lseekfunction是违法的。 问题1 :如果违反限制会怎样? 我写了一个代码片段,它工作正常。 问题2 :绕过限制2,一种方法如下: File *fpin, *fpout; fpin = fdopen(sockfd, “r”); fpout = fdopen(sockfd, “w”); /* Some Work Here */ fclose(fpin); fclose(fpout); 在教科书中,它说, 在线程程序中关闭已经关闭的描述符是灾难的一个方法。 为什么?

如何处理生成它的对象内的SIGPIPE错误?

我有两个应用程序,一个服务器和另一个客户端,都是用C ++和Qt编写的,但它们都使用C库,它使用C套接字方法在它们之间执行套接字通信(这一切都在Linux中)。 当它们都连接并关闭客户端时,当服务器尝试向其发送新消息时,它会收到SIGPIPE错误并关闭。 我在网上做了一些研究,在SO中看看如何为SIGPIPE创建一个处理程序,而不是关闭应用程序,我告诉定时器不断发送信息停止。 现在我确实学会了如何简单地处理信号:创建一个方法,在main()或global(内部)中接收int和使用信号(SIGPIPE,myMethod)(注意:从SO中学到了,是的,我知道signal()已经过时了)。 但问题是,通过这种方式,我无法停止向死客户端发送信息,因为处理信号的方法需要在发送消息的类之外或者静态方法,有权访问我的服务器对象。 为了澄清,这是当前的架构: //main.cpp void signal_callback_handler(int signum) { qDebug() << "Caught signal SIGPIPE" << signum << "; closing the application"; exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setApplicationName("ConnEmulator"); app.setApplicationVersion("1.0.0"); app.setOrganizationName("Embrasul"); app.setOrganizationDomain("http://www.embrasul.com.br"); MainWidget window; window.show(); /* Catch Signal Handler SIGPIPE */ signal(SIGPIPE, signal_callback_handler); return app.exec(); } // MainWidget类(简化) […]

如何将套接字动态绑定到一个网络接口?

目前我执行以下操作来侦听所有接口上的任何可用端口: // hints struct for the getaddrinfo call struct addrinfo hints, *res; memset(&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // Fill in addrinfo with getaddrinfo if (getaddrinfo(NULL, “0”, &hints, &res) != 0) { cerr << "Couldn't getaddrinfo." << endl; exit(-1); } 我想动态绑定到一个接口,即系统的非环回接口。 我该怎么做呢?

在C和python中实现sendall()和recvall()

我目前正在尝试在用C编写的服务器中实现sendall()函数,并在用python编写的相应客户端上实现recvall()函数。 我可以让服务器和客户端一起工作,因为它们都是用同一种语言编写的(即在c或两者都是在python中),但是我不能让它与c中的服务器和客户端一起工作python。 目前,我想从c服务器向python客户端发送一个简单的字符串。 C中的服务器sendall()实现如下(从Beej的指南中引用): int sendall(int socket, char * buf, int *len){ int total = 0; // how many bytes we’ve sent int bytesleft = *len; // how many we have left to send int n; while(total < *len) { n = send(socket, buf + total, bytesleft, 0); if (n == -1) { break; } […]

在哪里为SIGPIPE声明sig_t信号

我目前正在使用kqueue来处理Serverprocess中每个线程的多个客户端,因此我不希望在Signal SIGPIPE出现时终止该线程,我只想从kqueue中删除相应的socked id。 所以我的问题是:有没有办法在Signalhandle中获取相应的socketid并将其解析回Process以从事件kqueue中删除它,或者我将jsut转换为SIGPIPE的SIG_IGN并通过返回-1来处理删除发送? 并且它会在超时时间后返回-1值还是立即返回-1? 最后,如果信号忽略是我的解决方案:其中id必须放置声明 typedef void (*sig_t) (int); sig_t signal(int sig, sig_t func); 它必须在主要function? 还是在相应线程的开头? 还是作为全球元素?

C-套接字:编程客户端/服务器 – 应用程序以发送文件

我想编写一个应用程序来发送带有套接字的文件: 我的服务器: void str_server(int sock) { char buf[1025]; const char* filename=”test.text”; FILE *file = fopen(filename, “rb”); err_abort(“Test”); while (!feof(file)) { int rval = fread(buf, 1, sizeof(buf), file); send(sock, buf, rval, 0); } } 在这里我的客户: void RecvFile(int sock, const char* filename) { int rval; char buf[0x1000]; FILE *file = fopen(filename, “wb”); while ((rval = recv(sock, buf, […]

绑定错误(99):无法分配请求的地址

我试图让以下代码工作,但收到上述错误。 我有理由相信我输入的地址是正确的,因为它在一个执行类似任务的单独程序中工作。 这让我相信我犯了一些愚蠢的错误,任何帮助都会受到赞赏! /*Create TCP socket*/ int tcp_socket(void) { int s; while((s = socket(PF_INET,SOCK_STREAM,0))==-1 && errno == EINTR){ continue; } return s; } /*Bind tcp*/ int tcp_bind(int s, char *server, uint16_t port) { int rv; struct sockaddr_in sin; struct hostent *host_addr; assert(s >= 0); host_addr = gethostbyname(server); if (!host_addr) { perror(“gethostbyname(server)”); return -1; } memset(&sin, […]

中accept函数的地址大小长度

在“sys / socket.h”中它定义了函数: int accept (int socket, struct sockaddr *address, socklen_t *address_len); 我的问题与socklen_t * address_len有关 ,它基于手册指向socklen_t ,输入指定提供的sockaddr结构的长度,输出指定存储地址的长度。 在什么条件下, address_len大小输入与输出不同? 我需要这个,所以我可以在我为sockaddr_in结构创建的包装器上模拟一个测试用例。 非常感谢!