引入thread后socket接受不了报文了

2019-03-25 13:32|来源: 网路

不使用线程thread可以正常接受报文,加了后就在recvfrom那里不动了,是怎么回事?
using namespace std;
#include <thread>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>

void netlist()
{
int sockSrv = socket (AF_INET, SOCK_DGRAM, 0);
sockaddr_in addrSrv,addrClient;





addrSrv.sin_addr.s_addr = htonl(INADDR_ANY);

addrSrv.sin_family = AF_INET;

addrSrv.sin_port = htons(1986);

bind(sockSrv, (sockaddr *)&addrSrv,sizeof(sockaddr));



socklen_t len=sizeof(sockaddr);

char recvBuf[100];


recvfrom(sockSrv,recvBuf,100,0,(sockaddr*)&addrClient,&len);



cout<<recvBuf<<endl;

//closesocket(sockSrv);

}

int main()
{
thread t(netlist);
t.join();

return 0;
}

问题补充:
牟盖东 写道
敢问楼主用的是什么编译器,什么库?

从来没看见过thread标准库头文件,难道是boost?

牟盖东 写道
敢问楼主用的是什么编译器,什么库?

从来没看见过thread标准库头文件,难道是boost?


用的C++0X的thread   用g++ -std=c++0x xx.cpp -pthread编译的 

问题补充:不管是用ISO C++还是C++0X 没用thread就可以监听和接受包。  我测来  用了thread后,我用netstat -l看了都没有监听端口,bind后就没监听了。

问题补充:
zx339 写道
看到你的UPD服务器端代码,先BIND了,后面没有listen.
如果你是客户端代码,又没有先SENDTO


我不用线程来启动netlist方法是可以监听和接收包的,在main里不用thread t(netlist);t.join(); 这两行,用netlist();可以收到包,还要就是把#include <thread>去掉不然也不行(即使没用到里面的东西)。

问题补充:客户端是java写的:
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MulticastClient {

public static void main(String[] args)
{
MulticastSocket socket;
InetAddress address;

DatagramPacket packet;
try {
socket = new MulticastSocket(8000);
address = InetAddress.getByName("127.0.0.1");
//socket.joinGroup(address);

String str = "1234567";
System.out.println(str.getBytes().length);

for(int i=0;i<4;i++)
{
byte[] buf = str.getBytes();

packet = new DatagramPacket(buf,buf.length,address,1986);

socket.send(packet);

//socket.receive(packet);

//String str = new String(packet.getData());
System.out.println(str);
}

socket.close();

} catch (Exception e) {
e.printStackTrace();
}

}
}


问题补充:
zx339 写道
楼主你敢listen一下,你敢吗?


bind(sockSrv, (sockaddr *)&addrSrv,sizeof(sockaddr));

listen(sockSrv, 5);

socklen_t len=sizeof(sockaddr);
char recvBuf[100];

结果和没用listen一样的,不用thread可以,用了thread不可以。

问题补充:
zx339 写道
UDP好象也没RST, 不好意思, TCP搞多了. tcpdump可以查UDP发包的情况


谢谢你们的帮助,我也是刚开始学socket和thread,这个程序分开两个功能都可以运行,和起来就不行了。

相关问答

更多
  • 这个是个伪命题,socket可以发送数组,但只能是byte数组,所有的String,或者别的什么都必须转换为byte数组才可能发送。 所以如果你是byte数组,直接send就可以了。 如果你是别的,不管是不是数组,都必须通过转换的方式变成byte数组。转换常见的方式有两种,字符串的话 getByte()就可以了。其他类型需要转换成字符串再getByte,或者进行序列化操作。
  • import java.io.*; import java.net.*; import java.nio.channels.*; import java.util.*; import java.util.regex.*; public class Ping { static int DAYTIME_PORT = 13; static int port = DAYTIME_PORT; static class Target { InetSocketAddress address; SocketChannel ...
  • 你说的这种需求像是用于增强负载能力的反向代理,说白了就是代理服务器。自己开发的话难度也不大,不过如果是生产环境使用不建议你自己开发。 一般的HTTP服务器系统都支持反向代理(Apache、Nginx、IIS等),你可以百度一下Apache反向代理看看怎么在这些服务器系统上做配置。
  • 手中不是自己的电脑 没环境调试不了 不过我找了下面的内容 你看有帮助没: 最近,需要编写一个工具模拟HTTP Client, 登录到一个Server并且要添加一些数据。出现的问题是:login可以成功,但是,添加数据时,总是报错如下: HTTP/1.1 505 HTTP Version Not Supported Server: Apache-Coyote/1.1 Date: Wed, 26 Aug 2009 03:20:19 GMT Connection: close 根据错误的提示,应该是HTTP版本不 ...
  • 您可以使用设置默认超时 import socket print socket.getdefaulttimeout() socket.setdefaulttimeout(60) AFAIK这会影响所有的套接字操作 You can set the default timeout with import socket print socket.getdefaulttimeout() socket.setdefaulttimeout(60) AFAIK This will affect all the sock ...
  • 您的困惑在于认为套接字由服务器IP:服务器端口标识。 实际上,插座由四方信息唯一标识: Client IP : Client Port和Server IP : Server Port 所以当服务器IP和服务器端口在所有接受的连接中是不变的,客户端信息是什么允许它跟踪所有事情的发生。 澄清事情的例子: 假设我们有一个服务器在192.168.1.1:80和两个客户端,10.0.0.1和10.0.0.2。 10.0.0.1在本地端口1234上打开连接并连接到服务器。 现在服务器有一个套接字标识如下: 10.0.0 ...
  • 一般来说,你不关闭服务器,因为客户说再见。 这意味着任何用户都可以连接到您的服务器,无需您的控制即可远程关闭 关闭服务器由服务器的管理员或所有者处理,通常通过经过身份验证的ssh会话在服务器上运行命令来完成。 在unix / linux上你可能会运行: service chatserver stop 这是如何使这项工作成为另一个主题,但只是为了概述最佳实践。 现在,如果您想在对话结束时关闭客户端。 这更有意义: public class ChatServerThread implements Runnab ...
  • 这是你正在使用的图书馆吗? https://github.com/k84d/unpv13e/ readline函数似乎不是线程安全的。 他们使用静态缓冲区,没有什么可以防止并发访问。 Is this the library you're using? https://github.com/k84d/unpv13e/ The readline functions don't appear to be threadsafe. They use a static buffer and nothing to gua ...
  • 我想你错过了重要的代码部分。 因为你没有包含它,很难判断你是否使用FD_SET(),FD_ISSET()和朋友。 如果不是,那么肯定会得到奇怪的结果。 我认为粘贴代码比用文字解释更容易。 这是类似的事情对我有用: socket_descriptor=bindsock(thd); while(true) { fd_set rfs, wfs; FD_ZERO(&rfs); FD_ZERO(&wfs); FD_SET(socket_des ...
  • 这看起来像一个线程池的良好应用程序。 在您的实现中,您在数据库表中为每个项创建一个线程和套接字,这可能会极大地对系统征税。 在这里,我创建了20名工人作为例子。 当你开始对系统施加压力时,工人数量的回报会逐渐减少。 import multiprocessing.pool def sender(): pool = multiprocessing.pool.ThreadPool(20) # pick your size... cursor.execute("select * from data ...