Tag: 套接字

使用TCP时发送1个大块或大块小块是否更好?

在我accept()连接,然后write()到客户端套接字之后,最好是一次写入要发送的所有数据还是以块的forms发送它? 例如: 接受,写1MB,断开连接 …要么… 接受,写入256个字节,写入256个字节,… n,断开连接 我的直觉告诉我底层协议会自动执行此操作,并进行错误更正等。这是正确的,还是我应该将数据分块? 在你问之前,不,我不确定我在哪里想到数据的大块 – 我认为这是我从编程C#web服务中获得的本能(为了克服接收缓冲区限制等等,我认为)。 坏习惯? 注意 :我正在使用C.

如何在继续之前明确等待TCP ACK?

有没有办法让send()等待所有已发送的数据已被确认(如果已达到ACK的超时,则返回-1),或者是否有其他机制等待在send()之后但在做其他事情之前确认? 我使用的是标准的Unix Berkeley套接字API。 我知道我可以实现一个应用层ACK,但是当TCP的ACK很好地完成目的时,我宁愿不这样做。

使用标准C套接字API判断文本字符串是IPv6地址还是IPv4地址

我有一个程序,其中一个外部组件传递给我一个包含IP地址的字符串。 然后我需要把它变成一个URI。 对于IPv4来说这很容易; 我在前面添加http://并追加/。 但是,对于IPv6,我还需要用括号[]括起来。 是否有标准的套接字API调用来确定地址的地址族?

如何在c中的UDP套接字中设置源端口?

任何人都可以告诉我如何在UDP套接字中设置源端口地址吗? 我的客户端应用程序需要将数据包从57002端口发送到服务器端口58007。

从套接字读取缓冲区

我在c中编写简单的服务器/客户端,其中server临时存储来自客户端的消息,并在客户端请求时检索它。 问题是当客户端从服务器接收消息时,缓冲区行为有点奇怪。 我所做的只是从服务器接收并在屏幕上打印它,但不知何故缓冲区被覆盖超过最大缓冲区大小 在客户端 while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0) { if(byteRead <= 0) break; printf("%s", buffer); } 其中MAXBUF是256.它保留了一些垃圾,所以我检查了缓冲区中的字符串大小,令人惊讶 printf(“%d READ vs %d buffer strlen \n”, byteRead, strlen(buffer)) 告诉我byteRead是256但缓冲区的字符串长度是262。 任何的想法?? 服务器端的Ps,它正确读取文件并将其发送到套接字。

多播接收器套接字中的重复数据包

以下MulticastReceiver实现中似乎存在错误。 在为和创建两个实例时,我在每个流中获取两个包。 有什么指针吗? 我的猜测是REUSEADDR? class MulticastReceiverSocket { protected: const std::string listen_ip_; const int listen_port_; int socket_file_descriptor_; public: MulticastReceiverSocket ( const std::string & listen_ip, const int listen_port ) : listen_ip_ ( listen_ip ), listen_port_ ( listen_port ), socket_file_descriptor_ ( -1 ) { /* create socket to join multicast group on */ socket_file_descriptor_ = socket ( AF_INET, […]

为什么我的socket的开放端口没有被netstat列出?

如果您运行此示例,您将看到netstat从未列出该端口。 为什么? 我怎么做到这一点? #include #include #include #pragma comment(lib, “WS2_32”) int main() { WORD wVers = MAKEWORD(2, 2); WSADATA wsa; WSAStartup(wVers, &wsa); SOCKET sock = socket(AF_INET, SOCK_STREAM, 6); if (sock != INVALID_SOCKET) { struct sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); int addrlen = sizeof(addr); bind(sock, (struct sockaddr *)&addr, addrlen); if […]

使用select来读取socket和stdin

我正在写一个基于ncurses的聊天程序。 起初,我只编写网络内容(没有ncurses),一切正常,但添加图形后,我无法使客户端应用程序正常工作。 主要问题是同时从stdin和socket读取。 在ncurses-less版本中,我使用了pthread,它就像魅力一样。 唉,似乎pthread和ncurses没有很好地结合在一起,所以我不得不寻找另一种解决方案。 我认为select()会这样做,但它仍然只从stdin读取并完全忽略套接字。 这是整个代码: 代码 有趣的是: char message[1024]; fd_set master; fd_set read_fds; FD_ZERO(&master); FD_ZERO(&read_fds); FD_SET(0,&master); FD_SET(s,&master); // s is a socket descriptor while(true){ read_fds = master; if (select(2,&read_fds,NULL,NULL,NULL) == -1){ perror(“select:”); exit(1); } // if there are any data ready to read from the socket if (FD_ISSET(s, &read_fds)){ n = read(s,buf,max); buf[n]=0; […]

从结构,套接字编程发送数据

我有一个学校的任务,一部分是使用套接字编程从客户端向服务器发送一组int,chars char *。 发送整数或字符的工作正常,但有没有办法将整个结构作为一个数据包发送? 阅读有关序列化的内容,但我似乎无法使其正常工作。 这是一段代码: The struct looks like this: struct Msg { int a; char b; char *user; }; Client: init variables and such… int netcom(char* ip, int port) { sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // clear the structure bzero(&serveraddr, sizeof(struct sockaddr_in)); serveraddr.sin_family = AF_INET; // add the server adress inet_pton(AF_INET, ip, &serveraddr.sin_addr); […]

设置NSStreamNetworkServiceTypeBackground“做什么”?

我有一个内部应用程序(不适用于iPhone商店分发,因此不受Apple批准),它需要在运行时保留少量TCP和UDP套接字。 在测试时我注意到我的绑定套接字有一些奇怪的行为 – 它会在设备进入hibernate状态时关闭。 例如,当您按下手机顶部的电源按钮时,会发生这种情况,我真的不希望它这样做。 更不用说它似乎严重违反了BSD套接字API合同。 套接字代码全部用C语言编写,因此不使用Objective-C nsstream库。 我注意到有很多方法可以让VOIP,音乐流和其他东西保持套接字开放。 nsstream文档本身列出了一个NSStreamNetworkServiceTypeBackground属性,这似乎可以帮助我的应用程序在手机进入睡眠状态时保持其套接字打开。 apple docs的底部列出了以下属性: 常量 NSStreamNetworkServiceTypeVoIP 指定流正在提供VoIP服务。 NSStreamNetworkServiceTypeVideo 指定流正在提供video服务。 NSStreamNetworkServiceTypeBackground 指定流提供后台服务。 NSStreamNetworkServiceTypeVoice 指定流提供语音服务。 但由于我的应用程序的网络代码没有使用Objective-C API,我需要知道:上面的常量是如何实现的? 也许有一个未记录的套接字选项,我可以使用它来实现相同的结果? 基本上我只需要告诉内核在设备hibernate时不要弄乱我的套接字。 编辑 :作为逆向工程内核调用的替代方法,也许有一种方法可以将我的套接字文件描述符传递给Objective-C代码,在这些代码中可以应用这些选项?