Tag: 套接字

什么是异步套接字?

什么是异步套接字? 它们与普通套接字(阻塞和非阻塞)有何不同? 任何指向这个方向的指针或指向教程的任何链接都会有所帮助。 谢谢。

如何投射sockaddr_storage并避免违反严格别名规则

我正在使用Beej的网络指南,并遇到了一个别名问题。 他提出了一个函数来返回特定结构的IPv4或IPv6地址: 1 void *get_in_addr( struct sockaddr *sa ) 2 { 3 if (sa->sa_family == AF_INET) 4 return &(((struct sockaddr_in*)sa)->sin_addr); 5 else 6 return &(((struct sockaddr_in6*)sa)->sin6_addr); 7 } 这会导致GCC为第3行的sa吐出严格别名错误。据我所知,这是因为我这样调用这个函数: struct sockaddr_storage their_addr; … inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr), connection_name, sizeof connection_name); 我猜测别名与their_addr变量的类型为sockaddr_storage并且另一个不同类型的指针指向同一内存的事实有关。 是解决这个问题的最佳方法sockaddr_storage , sockaddr_in和sockaddr_in6成为一个联盟? 看起来这应该是网络中的磨损领域,我只是找不到任何有最佳实践的好例子。 此外,如果有人能够准确解释别名问题发生的位置,我会非常感激。

如何发送和接收数据套接字TCP(C / C ++)

可能重复: 在C / C ++中从TCP套接字读取的正确方法是什么? 我正在尝试开发TCP客户端/服务器。 我的问题是,当我尝试从客户端发送数据时,我会在一次发送中执行此操作。 但是当我尝试接收具有特定结构的数据时出现我的问题,我的意思是,前8个字节设置日期,接下来的10个名称和未定义的字节数设置文本(此文本以/ r / n结尾) / R / N) 客户端发送如下: char date[8]; char name[10]; char msg[4096]; strcpy(msg,”12/10/12″); //8 bytes strcat(msg,”Kevin Fire”); //10 bytes strcat(msg,”abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde\r\n\r\n”); nbytes_sent = send(sock,(char *)msg,sizeof(msg),0); printf(“Bytes_sent: %s -> %i\n”,msg,nbytes_sent); 并且服务器尝试从socket解析数据,如下所示: char date[8]; char name[10]; char * text; char buf[1024]; int i=0; for(i=0; i < 8; i++) […]

如何防止SIGPIPE或阻止服务器结束?

一个非常标准的C ++ TCP服务器程序,使用pthreads , bind , listen和accept 。 我有一个场景,当我杀死连接的客户端时, 服务器结束 (读取:崩溃)。 崩溃的原因是对文件的write()调用失败,因此程序收到SIGPIPE。 我猜,这会让服务器退出。 我想,“当然,未处理的信号意味着退出”,所以让我们使用signal() : signal(SIGPIPE, SIG_IGN); 因为,取自man 2 write : EPIPE fd连接到读取端关闭的管道或sockets。 当发生这种情况时,写入过程也将收到SIGPIPE信号。 (因此,仅当程序捕获,阻止或忽略此信号时才会看到写入返回值。) 唉,没有。 无论是在服务器线程还是客户端线程中,这似乎都没有帮助。 那么, 如何阻止write()调用引发该信号,或者(务实)如何阻止服务器退出。 我的诊断是: 服务器线程启动,绑定,侦听,接受。 让客户端连接(例如通过telnet) 发送一个pkill telnet来崩溃客户端 不需要的行为:服务器退出,在gdb中 … in write () at ../sysdeps/unix/syscall-template.S:82 82 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) 和回溯 : #0 … in write () at ../sysdeps/unix/syscall-template.S:82 […]

使用C套接字在HTTP响应中发送二进制文件

我试图在http响应中发送二进制文件(png图像)。 FILE *file; char *buffer; int fileLen; //Open file file = fopen(“1.png”, “rb”); if (!file) { return; } //Get file length fseek(file, 0, SEEK_END); fileLen=ftell(file); fseek(file, 0, SEEK_SET); //Allocate memory buffer=(char *)malloc(fileLen+1); if (!buffer) { fprintf(stderr, “Memory error!”); fclose(file); return; } //Read file contents into buffer fread(buffer, fileLen, 1, file); fclose(file); //free(buffer); char header[102400]; sprintf(header, […]

使用select()进行非阻塞套接字连接始终返回1

这个问题非常相似(或几乎完全相同) 在非阻塞套接字连接中,select()总是返回1 ; 但是,我似乎无法找到我的代码蹒跚的地方。 我正在使用非阻塞套接字,并希望在将客户端连接到服务器时使用select()来检查超时/成功。 问题是select()总是几乎立即返回1,即使我甚至没有服务器运行,也没有什么可以连接到。 在此先感谢您的帮助,代码段如下: //Loop through the addrinfo structs and try to connect to the first one we can for(p = serverinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { //We couldn’t create the socket, try again perror(“client: socket”); continue; } //Set the socket […]

可以通过TCP进行广播吗?

我正在用C编写服务器/客户端系统,它在TCP连接下使用BSD套接字。 服务器是multithreading的,每个连接都在自己的接收器中运行。 每个客户端都能很好地与服务器进行一对一的交谈,遗憾的是我无法想到实现SendToAll()函数的方法,例如,如果客户端A做了需要发送数据包的事情。所有的客户。 我该怎么办? 我正在考虑在每个接收器中实现队列,并且任何广播都被发送到这些队列; 当接收器发出一个新数据包时,它会将该消息添加到数据包中,如果这有意义的话。 但是,有没有办法通过TCP广播,就像你可以通过UDP?

使用C进行套接字编程的双向通信

我对套接字编程有一点疑问。 我能够将数据从客户端发送到服务器,我的服务器处理数据。 处理完的数据的o / p,我想发回给我的客户。 那么我们可以使用相同的套接字将数据“写”回客户端。 我的意思是服务器在接受连接和接收数据之前侦听端口,所以类似地,我需要让我的客户端监听其他端口(将其绑定到其他套接字)并使我的服务器连接到该套接字并将数据传回。 任何forms的例子或解释或参考将不胜感激。 非常感谢提前。

重新创建套接字时绑定错误

A具有以下侦听器套接字: int sd = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(http_port); addr.sin_addr.s_addr = INADDR_ANY; if(bind(sd,(sockaddr*)&addr,sizeof(addr))!=0) { … } if (listen(sd, 16)!=0) { … } int sent = 0; for(;;) { int client = accept(sd, (sockaddr*)&addr, (socklen_t*)&size); if (client > 0) { … close(client); } } 如果使用 close(sd); 然后尝试使用相同的代码重新创建套接字,发生绑定错误,并且仅在30-60秒后成功创建新套接字。 […]

不能同时包含这两个文件(WinSock2,Windows.h)

我遇到了包括这两个文件的问题。 现在,我知道我需要首先包含Winsock2,然后是windows.h,或者简单地说: #define WIN32_LEAN_AND_MEAN 但是,我还有问题 我有一个名为XS.h的头文件,看起来像这样 #ifndef XS_H #define XS_H #include #include #include #endif 我在头文件Client.h包含了Client.h Client.h include看起来像这样: #ifndef CLIENT_H #define CLIENT_H #include “XS.h” XS.h是我在Client.h唯一包含,但我仍然遇到错误(正如你所看到的, Winsock包含在windows.h之前) 我得到了大约78个错误,以下是其中一些错误: Error 90 error C3861: ‘WSASetLastError’: identifier not found c:\program files (x86)\windows kits\8.0\include\um\ws2tcpip.h 703 Error 61 error C2375: ‘WSAStartup’ : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h 2296 Error 49 […]