我想写一个基于c/s结构的程序,使用udp协议,不想使用mfc。主要实现client发送消息给server,server接收消息这一功能.
请教大家一下,以下客户端和服务端的代码是否正确!
//////////////////////////////////
客户端的程序,可以发送数据
LocalSock = socket(AF_INET, SOCK_DGRAM, 0);
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_port = htons(CONNECT_PORT);
LocalAddress.sin_addr.S_un.S_addr = inet_addr( GetLocalIPAddress() );
这里到底要使用哪一句??
//LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY);//
bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
//设置服务器的ip地址,我察看了内存RemoteAddress.sin_addr.S_un.S_addr设置正确
RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_port = htons(CONNECT_PORT);
RemoteAddress.sin_addr.S_un.S_addr = inet_addr( m_chRemoteIPAddress );
numWritten = sendto(LocalSock, (char *)buf , strlen(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , sizeof(RemoteAddress) );///////////////////////////
服务器端程序,老是接收不到消息????为什么
//初始化本地地址,将其和LocalSock连接
LocalSock = socket(AF_INET, SOCK_DGRAM, 0);
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_port = htons(CONNECT_PORT);
LocalAddress.sin_addr.S_un.S_addr = inet_addr( GetLocalIPAddress() );
这里到底要使用哪一句??
//LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY);//
bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
ret = recvfrom(LocalSock , (char*)buf , sizeof(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , &addr_size );////////////////////////
大家看看,到底问题出在那??为什么服务端老是接收不到信息???
谢谢
请教大家一下,以下客户端和服务端的代码是否正确!
//////////////////////////////////
客户端的程序,可以发送数据
LocalSock = socket(AF_INET, SOCK_DGRAM, 0);
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_port = htons(CONNECT_PORT);
LocalAddress.sin_addr.S_un.S_addr = inet_addr( GetLocalIPAddress() );
这里到底要使用哪一句??
//LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY);//
bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
//设置服务器的ip地址,我察看了内存RemoteAddress.sin_addr.S_un.S_addr设置正确
RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_port = htons(CONNECT_PORT);
RemoteAddress.sin_addr.S_un.S_addr = inet_addr( m_chRemoteIPAddress );
numWritten = sendto(LocalSock, (char *)buf , strlen(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , sizeof(RemoteAddress) );///////////////////////////
服务器端程序,老是接收不到消息????为什么
//初始化本地地址,将其和LocalSock连接
LocalSock = socket(AF_INET, SOCK_DGRAM, 0);
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_port = htons(CONNECT_PORT);
LocalAddress.sin_addr.S_un.S_addr = inet_addr( GetLocalIPAddress() );
这里到底要使用哪一句??
//LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY);//
bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
ret = recvfrom(LocalSock , (char*)buf , sizeof(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , &addr_size );////////////////////////
大家看看,到底问题出在那??为什么服务端老是接收不到信息???
谢谢
但是不要使用mfc!
谢谢
客户端的程序,可以发送数据
########## 如果客户端不接收数据以下四行包括bind那一行,全不要
LocalSock = socket(AF_INET, SOCK_DGRAM, 0);
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_port = htons(CONNECT_PORT);
LocalAddress.sin_addr.S_un.S_addr = inet_addr( GetLocalIPAddress() );
这里到底要使用哪一句??
//LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY);//
bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)//设置服务器的ip地址,我察看了内存RemoteAddress.sin_addr.S_un.S_addr设置正确
RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_port = htons(CONNECT_PORT);
RemoteAddress.sin_addr.S_un.S_addr = inet_addr( m_chRemoteIPAddress );
numWritten = sendto(LocalSock, (char *)buf , strlen(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , sizeof(RemoteAddress) );///////////////////////////
服务器端程序,老是接收不到消息????为什么
//初始化本地地址,将其和LocalSock连接
LocalSock = socket(AF_INET, SOCK_DGRAM, 0);
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_port = htons(CONNECT_PORT);
LocalAddress.sin_addr.S_un.S_addr = inet_addr( GetLocalIPAddress() );
这里到底要使用哪一句?? ############# 使用下一句!!!
//LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY);//
bind(LocalSock, (LPSOCKADDR)&LocalAddress, sizeof(LocalAddress)
ret = recvfrom(LocalSock , (char*)buf , sizeof(buf) , 0 ,
(LPSOCKADDR)&RemoteAddress , &addr_size );
我试看看
LocalAddress.sin_addr.S_un.S_addr = htonl( INADDR_ANY)
这句话,是不是表示服务端可以接受任何地址的请求??
udp.cpp
*/#include <stdio.h>
#include <windows.h>
#include <winsock.h>#pragma comment (lib, "ws2_32.lib")int main (void)
{
char buf [0x1000];
WSADATA wsa;
WSAStartup (MAKEWORD (2, 2), &wsa); SOCKET clnt = ::socket (AF_INET, SOCK_DGRAM, 0);
SOCKET serv = ::socket (AF_INET, SOCK_DGRAM, 0); sockaddr_in sa_clnt, sa_serv; memset (&sa_clnt, 0, sizeof (sa_clnt));
memset (&sa_serv, 0, sizeof (sa_serv)); sa_clnt.sin_family = AF_INET;
sa_clnt.sin_port = htons (1234);
sa_clnt.sin_addr.s_addr = inet_addr ("127.0.0.1"); bind (clnt, (sockaddr *)&sa_clnt, sizeof (sa_clnt)); sa_serv.sin_family = AF_INET;
sa_serv.sin_port = htons (4321);
sa_serv.sin_addr.s_addr = inet_addr ("127.0.0.1"); bind (serv, (sockaddr *)&sa_serv, sizeof (sa_serv)); // 客户端发送消息到服务端
sendto (clnt, "我是客户端", sizeof ("我是客户端"),
0, (sockaddr *)&sa_serv, sizeof (sa_serv)); // 服务端接收消息, 如果要得到消息来源,请使用recvfrom
recv (serv, buf, sizeof (buf), 0);
printf ("服务端接收到客户端的消息:%s\n", buf); // 服务端发送消息到客户端
sendto (serv, "我是服务端", sizeof ("我是服务端"), 0,
(sockaddr *)&sa_clnt, sizeof (sa_clnt)); // 客户端接收消息, 如果要得到消息来源,请使用recvfrom
recv (clnt, buf, sizeof (buf), 0);
printf ("客户端接收到服务端的消息:%s\n", buf); closesocket (clnt);
closesocket (serv);
WSACleanup ();
};
你的程序太好了,给我很大的帮助。在这里我还有几个问题要请教你!
1。sa_clnt.sin_port = htons (1234);
sa_serv.sin_port = htons (4321);
这里的1234与4321是什么关系,是巧合。还是要有字节顺序???
2。recv是阻塞的,而recv是非阻塞的。是吗?
你的程序太好了,给我很大的帮助。在这里我还有几个问题要请教你!
1。sa_clnt.sin_port = htons (1234);
sa_serv.sin_port = htons (4321);
这里的1234与4321是什么关系,是巧合。还是要有字节顺序???
2。recv是阻塞的,而recv是非阻塞的。是吗?
你个我的那个例子在本机上,我把他分成两个两个程序,可以通讯!
但是问题是我把他放到两台不同的机器上,却不行了
为什么!
ip地址我可是改了
sa_clnt.sin_family = AF_INET;
sa_clnt.sin_port = htons (1234);
sa_clnt.sin_addr.s_addr = inet_addr ("客户端地址");
bind (clnt, (sockaddr *)&sa_clnt, sizeof (sa_clnt));
sa_serv.sin_family = AF_INET;
sa_serv.sin_port = htons (4321);
sa_serv.sin_addr.s_addr = inet_addr ("服务器地址");
bind (serv, (sockaddr *)&sa_serv, sizeof (sa_serv));
// 客户端发送消息到服务端
sendto (clnt, "我是客户端", sizeof ("我是客户端"),
0, (sockaddr *)&sa_serv, sizeof (sa_serv));
#include <stdio.h>
#include <windows.h>
#include <winsock.h>#pragma comment (lib, "ws2_32.lib")int main (void)
{
char buf [0x1000];
WSADATA wsa;
WSAStartup (MAKEWORD (2, 2), &wsa); SOCKET clnt = ::socket (AF_INET, SOCK_DGRAM, 0); sockaddr_in sa_clnt, sa_serv; memset (&sa_clnt, 0, sizeof (sa_clnt));
memset (&sa_serv, 0, sizeof (sa_serv)); sa_clnt.sin_family = AF_INET;
sa_clnt.sin_port = htons (1234);
sa_clnt.sin_addr.s_addr = 0; bind (clnt, (sockaddr *)&sa_clnt, sizeof (sa_clnt)); sa_serv.sin_family = AF_INET;
sa_serv.sin_port = htons (4321);
sa_serv.sin_addr.s_addr = inet_addr ("服务端IP"); // 你自己改 // 客户端发送消息到服务端
sendto (clnt, "我是客户端", sizeof ("我是客户端"),
0, (sockaddr *)&sa_serv, sizeof (sa_serv)); // 客户端接收消息, 如果要得到消息来源,请使用recvfrom
recv (clnt, buf, sizeof (buf), 0);
printf ("客户端接收到服务端的消息:%s\n", buf); closesocket (clnt);
WSACleanup ();
};
服务端
#include <stdio.h>
#include <windows.h>
#include <winsock.h>#pragma comment (lib, "ws2_32.lib")int main (void)
{
char buf [0x1000];
WSADATA wsa;
WSAStartup (MAKEWORD (2, 2), &wsa); SOCKET serv = ::socket (AF_INET, SOCK_DGRAM, 0); sockaddr_in sa_clnt, sa_serv; memset (&sa_clnt, 0, sizeof (sa_clnt));
memset (&sa_serv, 0, sizeof (sa_serv)); sa_clnt.sin_family = AF_INET;
sa_clnt.sin_port = htons (1234);
sa_clnt.sin_addr.s_addr = inet_addr ("客户端IP"); // 你自己改 sa_serv.sin_family = AF_INET;
sa_serv.sin_port = htons (4321);
sa_serv.sin_addr.s_addr = 0; bind (serv, (sockaddr *)&sa_serv, sizeof (sa_serv)); // 服务端接收消息, 如果要得到消息来源,请使用recvfrom
recv (serv, buf, sizeof (buf), 0);
printf ("服务端接收到客户端的消息:%s\n", buf); // 服务端发送消息到客户端
sendto (serv, "我是服务端", sizeof ("我是服务端"), 0,
(sockaddr *)&sa_clnt, sizeof (sa_clnt)); closesocket (serv);
WSACleanup ();
};