c#socket广播收不到

c#socket广播收不到,第1张

C# socket 广播收不到可能有以下原因:

(1)网络不通,关闭了广播端口

(2)发送广播的程序使用了不同的端口,导致无法接收;

(3)计算机上有软件防火墙,关闭了接收程序的相关端口;

(4)防火墙策略没有将网络报文中的IP地址白名单放进去;

(5)目的地的程序未正确接收广播报文,导致报文丢失。

为此,需要对网络进行检查,检查广播端口是否被关闭,检查防火墙是否阻止了接收程序的相关端口,确保计算机上的防火墙策略中有放入网络报文中的IP地址白名单,最后确保目的地程序能够正确接收广播报文,以保证能够成功接收到socket广播。

这是一个发送多播帧的例子:

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <resolv.h>

#include <string.h>

#include <unistd.h>

#include <time.h>

#define SERV_PORT 5000

int main(int,char**)

{

int SendtoSocket

sockaddr_in SendtoAddr

int AddrLen=sizeof(SendtoAddr)

char szBuffer[200]="This is a test\n"

char *szTime

SendtoSocket=socket(AF_INET,SOCK_DGRAM,0)

bzero(&SendtoAddr,sizeof(SendtoAddr))

SendtoAddr.sin_family=AF_INET

SendtoAddr.sin_port=htons(SERV_PORT)

inet_pton(AF_INET,"224.0.3.1",&SendtoAddr.sin_addr)

const int on=1

// setsockopt(SendtoSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))

time_t CurrentTime

for()

{

time(&CurrentTime)

szTime=ctime(&CurrentTime)

sendto(SendtoSocket,szTime,strlen(szTime),0,(sockaddr *)&SendtoAddr,AddrLe

n)

sleep(1)

}

}

这是接收多播帧的例子:

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <resolv.h>

#include <string.h>

#include <unistd.h>

#define SERV_PORT 5000

int main(int,char**)

{

int RecvSocket

sockaddr_in ServAddr

socklen_t AddrLen=sizeof(ServAddr)

char szBuffer[201]

RecvSocket=socket(AF_INET,SOCK_DGRAM,0)

bzero(&ServAddr,sizeof(ServAddr))

ServAddr.sin_family=AF_INET

ServAddr.sin_addr.s_addr=htonl(INADDR_ANY)

ServAddr.sin_port=htons(SERV_PORT)

bind(RecvSocket,(sockaddr *)&ServAddr,AddrLen)

ip_mreq mreq

inet_pton(AF_INET,"224.0.3.1",&mreq.imr_multiaddr.s_addr)

mreq.imr_interface.s_addr=ServAddr.sin_addr.s_addr

setsockopt(RecvSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))

int nRecv

for()

{

nRecv=recvfrom(RecvSocket,szBuffer,200,0,(sockaddr *)&ServAddr,&AddrLen)

szBuffer[nRecv]='\0'

printf(szBuffer)

}

}

根据你的改了个!不好意思,其中读写的思路稍微有点不同!不过可以做参考!

Server端代码:

import java.net.*

import java.io.*

import java.util.*

public class TestServer {

ServerSocket s = null

boolean started = false//用来监听服务器是否启动!

List<ServerReaderWriter>clients = new ArrayList<ServerReaderWriter>()//用来存放启动的客服

public static void main(String[] args) {

new TestServer().start()

}

public void start() {

try {

s = new ServerSocket(5050)

started = true

} catch(SocketException e) {

System.out.println("5050端口正在使用中!!!请关掉相关程序并重新运行服务器!")

System.exit(0)

} catch (IOException e) {

e.printStackTrace()

}

int i = 1

try {

while(started) {

Socket ss = s.accept()

ServerReaderWriter c = new ServerReaderWriter(ss)//建立客服端

System.out.println("第" + i + "个客服端启动!")

++i

new Thread(c).start()//启动线程

clients.add(c)

}

} catch (EOFException e) {

System.out.println("客服端被关闭!")

} catch (IOException e) {

e.printStackTrace()

} finally {

try {

s.close()

} catch (IOException e) {

e.printStackTrace()

}

}

}

class ServerReaderWriter implements Runnable { //建议使用Runnable避免你重写run方法麻烦!

private Socket s

private DataInputStream dis = null//注意赋值,养成好习惯!

private DataOutputStream dos = null

private boolean bConnected = false//用于调用连接成功后的run方法

public ServerReaderWriter(Socket s) {

this.s = s

try {

dis = new DataInputStream(s.getInputStream())

dos = new DataOutputStream(s.getOutputStream())

bConnected = true

} catch (IOException e) {

e.printStackTrace()

}

}

public void send(String str) {

try {

dos.writeUTF(str)

} catch (IOException e) {

clients.remove(this)

System.out.println("有客户退出!")

}

}

public void run() {

try {

while (bConnected) {

String input = dis.readUTF()

System.out.println(input)

for(int i=0i<clients.size()++i) {

ServerReaderWriter c = clients.get(i)

c.send(input)

}

}

} catch(SocketException e) {

System.out.println("一个客服端已关闭,请勿再像他发送信息!")

} catch (EOFException e) {

System.out.println("谢谢使用!")

}catch (IOException e) {

e.printStackTrace()

} finally {

try {

if (dis != null) {

dis.close()

}

if (dos != null) {

dos.close()

}

if (s != null) {

s.close()

s = null

}

//clients.clear()

} catch (IOException e1) {

e1.printStackTrace()

}

}

}

}

}

Client端代码:

import java.io.*

import java.net.*

import java.awt.*

import java.awt.event.*

public class TestClient extends Frame { //用到Frame生产界面比较直观

Socket s = null

DataOutputStream dos = null

DataInputStream dis = null

private boolean bConnected = false

TextField tfText = new TextField()

TextArea taContent = new TextArea()

Thread tRecv = new Thread(new ClientReaderWriter())

public static void main(String[] args){

new TestClient().launchFrame()

}

public void launchFrame() {

this.setSize(300, 300)//设置客服端窗口格式

this.setLocation(400, 300)

add(tfText, BorderLayout.SOUTH)

add(taContent, BorderLayout.NORTH)

this.pack()

this.addWindowListener(new WindowAdapter() { //监听窗口关闭事件

public void windowClosing(WindowEvent arg0) {

disconnect()

System.exit(0)

}

})

tfText.addActionListener(new TFListener())

setVisible(true)

connect()

tRecv.start()

}

public void connect() {

try {

s = new Socket("127.0.0.1", 5050)//依据自己的服务器,我这里用的localhost

dos = new DataOutputStream(s.getOutputStream())

dis = new DataInputStream(s.getInputStream())

System.out.println("连接服务器!")

bConnected = true

} catch(ConnectException e) {

System.out.println("请检查服务器是否启动!")

try {

Thread.sleep(1000)

} catch (InterruptedException e1) {

e1.printStackTrace()

}

System.exit(0)

}

catch (UnknownHostException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

}

public void disconnect() {

try {

dos.close()

dis.close()

s.close()

} catch (IOException e) {

e.printStackTrace()

}

}

private class TFListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

String str = tfText.getText().trim()

tfText.setText("")

try {

dos.writeUTF(str)

if(str.equals("bye")){

System.exit(0)

}

dos.flush()

} catch (IOException e1) {

e1.printStackTrace()

}

}

}

class ClientReaderWriter implements Runnable {

public void run() {

try {

while(bConnected) {

String input = dis.readUTF()

taContent.setText(taContent.getText() + input +'\n')

}

} catch (SocketException e) {

System.out.println("轻轻的我走了!Bye-bye!")

} catch (EOFException e) {

System.out.println("我断网了,再见!")

}

catch (IOException e) {

e.printStackTrace()

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7964775.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存