C++和C#UDP可以通信吗

C++发信息 C#接收
C++代码:WORD version;
WSADATA wsa_data;
sockaddr_in server_address;
version=MAKEWORD(2,2);
server_address.sin_family=AF_INET;
server_address.sin_port=htons(8888);
server_address.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
::WSAStartup(version,&wsa_data);
SOCKET clientSocket=socket(AF_INET,SOCK_DGRAM,0);
::connect(clientSocket,(sockaddr*)&server_address,sizeof(server_address));
send(clientSocket, data, sizeof(data), 0);
C#
_udpClient = new UdpClient(8888);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
byte[] byRead = this._udpClient.Receive(ref remote);

但是接收不到啊

第1个回答  2011-04-28
@首先,UDP是一个协议,与具体的实现语言无关,所以C++写的UDP程序和C#写的UDP程序完全是可以通信的,不会受编程语言影响
@在我看来,上面的C++代码调用了connect这个函数,但是connect是TCP协议使用的函数,在上面对应位置应该使用bind函数,具体实现你自己查找
@总之,我的看法是你的C++似乎是一个TCP通信协议的代码,它果断不能和下面的UDP协议的代码通信追问

兄弟,你说的有道理 我又改了下 但是还是不成功
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(8000);
local.sin_addr.s_addr=INADDR_ANY;//本机
SOCKET socket1=socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)&local,sizeof local);
sendto(socket1,data,sizeof data,0,(struct sockaddr*)&from,fromlen);

追答

::WSAStartup(version,&wsa_data)是winsock的初始化函数,我想你应该把它放在最前面,否则你在创建套接字的时候就会失败,更不要说后面调用绑定之类的方法。

msdn有bind函数的描述
int bind(
SOCKET s,
const struct sockaddr *addr,
int namelen );

要使通信成功必须保证bind调用成功,你可以这样检测bind是否调用成功

int nRet = bind(socket1,(struct sockaddr*)&local,sizeof local);
ASSERT( SOCKET_ERROR != nRet );

如果出现了一个ASSERT,说明你的bind调用失败,你必须设法让bind调用成功。
更多资料你可以到msdn上去找。

追问

我滴个神啊 谢谢啊 虽然还没有接收成功 但是bind总算调用对了 WSAStartup这个函数是起到什么作用啊 我看网上还有提到WSASocket 这个又是什么啊

本回答被提问者采纳
第2个回答  2011-04-28
socket网络编程,实现二个程序直接通信与具体的编程语言没有关系,UDP只是一个底层通信协议而已,类似与TCP。sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采 用的数据报套接字(SOCK_DGRAM).
如果你需要一个发消息一个收消息,那就需要做内部约定好,一个程序编写成UDP的server程序,一个程序编写成DUP的cient程序,server和client可以自行定义,保证server和client可以正常连接,另外,发送方C++需要写发送数据send函数或writefm函数,接收方C#程序,需要些receive函数或者read函数接收数据,遵守二者约定就可以了。UDP程序创建socket()时第二个参数为SOCK_DGRAM。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。socket编程模式都是遵循相同规则的。
server端程序编写过程:
1、加载套接字库
2、创建套接字(socket)。
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
7、返回,等待另一客户请求。
8、关闭套接字。
client端程序编写过程:
1、加载套接字库
2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
5、关闭套接字
呵呵,每个过程就是个简单的socket函数调用而已了。只是不同的语言可能调用的函数不同而已了。例如unix的C++调用的是动态链接库lsocket 。VC和C#调用socket组件,java调用socket.jar包就可以了。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网