初学socket编程者的问题:TCP与UDP 使用MFC的CSocket类进行TCP和UDP操作有什么区别,尤其是如何接收固定端口的广播该如何编程,发送UDP广播怎样编程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://cs.baylor.edu/~donahoo/practical/CSockets/mfc///multicast using CAsyncSocket/////////////////////// fd_set fds; FD_ZERO(&fds); FD_SET(m_Socket, &fds); struct timeval timeout; timeout.tv_sec = m_Timeout; timeout.tv_usec = 0; switch (select(0, NULL, &fds, NULL, &timeout)) { case SOCKET_ERROR: return GetLastErrorCode(); case 0: return ERROR_SOCKET_TIMEOUT; } SOCKADDR_IN addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(255.255.255.255); addr.sin_port = htons(9999); int send_len = sendto(m_Socket, (char *)buffer, len, 0, (struct sockaddr *)&addr, sizeof(SOCKADDR)); if (send_len == SOCKET_ERROR || send_len == 0) return GetLastErrorCode(); //////主 题: 在局域网中, 使用 SOCKET编程,如何广播消息??? /////////////////////////////////////////////////// //发送端程序 #include <stdio.h > #include <winsock.h > int main(int argc, char* argv[]) { WSADATA wsaData; //指向WinSocket信息结构的指针 SOCKET sockListener; SOCKADDR_IN sin,saUdpServ; BOOL fBroadcast = TRUE; char sendBuff[1024]; int nSize; int ncount=0; if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化 { printf( "Can't initiates windows socket!Program stop.\n ");//初始化失败返回-1 return -1; } sockListener=socket(PF_INET,SOCK_DGRAM,0); setsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast,sizeof ( BOOL )); sin.sin_family = AF_INET; sin.sin_port = htons(0); sin.sin_addr.s_addr = htonl(INADDR_ANY); if(bind( sockListener, (SOCKADDR *)&sin, sizeof(sin))!=0) { printf( "Can't bind socket to local port!Program stop.\n ");//初始化失败返回-1 return -1; } saUdpServ.sin_family = AF_INET; saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST ); saUdpServ.sin_port = htons (7001);//发送用的端口,可以根据需要更改 nSize = sizeof ( SOCKADDR_IN ); while(1) { sprintf(sendBuff, "Message %d ",ncount++); sendto ( sockListener,sendBuff, lstrlen (sendBuff), 0, (SOCKADDR *) &saUdpServ, sizeof ( SOCKADDR_IN )); printf( "%s\n ",sendBuff); } return 0; } ///////////////////// //接收 #include <stdio.h > #include <winsock.h > #include <conio.h > int main(int argc, char* argv[]) { WSADATA wsaData; //指向WinSocket信息结构的指针 SOCKET sockListener; SOCKADDR_IN sin,saClient; char cRecvBuff[1024]; int nSize,nbSize; int iAddrLen=sizeof(saClient); if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化 { printf( "Can't initiates windows socket!Program stop.\n ");//初始化失败返回-1 return -1; } sockListener=socket(AF_INET, SOCK_DGRAM,0); sin.sin_family = AF_INET; sin.sin_port = htons(7001);//发送端使用的发送端口,可以根据需要更改 sin.sin_addr.s_addr = htonl(INADDR_ANY); if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0) { printf( "Can't bind socket to local port!Program stop.\n ");//初始化失败返回-1 return -1; } while(1) { nSize = sizeof ( SOCKADDR_IN ); if((nbSize=recvfrom (sockListener,cRecvBuff,1024,0, (SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) { printf( "Recive Error "); break; } cRecvBuff[nbSize] = '\0'; printf( "%s\n ",cRecvBuff); } return 0; } 广播只有UDP才有的, TCP是点对点的,面向连接的,没有广播。 schttp://ycjy.jsipt.edu.cn/jsjx/VC/NewUpdate/MFC_CPP/columnist_paper.pl-aid=unicode&pid=6.htm 建议看看《计算机网络》,masterz() 太详细了,还是把概念理解了在编程。 UDP是面向纪录,面向无连接的,不可靠.若发送可变长度的数据包,会有丢包现象.TCP是面向流,面向连接的,很可靠,可以保证数据包顺序的收到,不会有丢包产生. udp是面向无连接的,TCP是面向连接的TCP保证数据的可靠传输,一般用于大量数据传输的应用中,每次连接都要确定一条数据链路开销比较大而UDP只是尽力发送数据,并不保证对方一定收到(但可自己编程控制),一般用于需要多次传输数据但数据量并不大的应用中,比如QQ,ICQ我也在学习网络编程,让我们共同进步,我的e-mail:[email protected] 问一个MFC类变量是局部还是全局的问题 多线程问题 在MDI程序中使用CMFCOutlookBar,给他加个TreeCtrl 我想在MainFrm处理TreeCtrl的双击事件 该如何做 CDatabase与CRecordset 的Close()问题 SFTP上传文件 关于VC 6.0 WIN32编程的疑问~!急~! 紧急求助,关于dll调用的问题,大侠们请进来指点,指点. 如何处理打印换页问题 ●●●●有谁知道“能申请免费主页的国外网站”有哪些? 很急:下面这段代码应该怎么添加?关于键盘hook的 第一次用VC做,大家给点意见 指向MAINFRAME的对话框如何显示?
FD_ZERO(&fds);
FD_SET(m_Socket, &fds);
struct timeval timeout;
timeout.tv_sec = m_Timeout;
timeout.tv_usec = 0;
switch (select(0, NULL, &fds, NULL, &timeout))
{
case SOCKET_ERROR:
return GetLastErrorCode();
case 0:
return ERROR_SOCKET_TIMEOUT;
} SOCKADDR_IN addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(255.255.255.255);
addr.sin_port = htons(9999);
int send_len = sendto(m_Socket, (char *)buffer, len, 0, (struct sockaddr *)&addr, sizeof(SOCKADDR));
if (send_len == SOCKET_ERROR || send_len == 0) return GetLastErrorCode(); //////主 题: 在局域网中, 使用 SOCKET编程,如何广播消息??? ///////////////////////////////////////////////////
//发送端程序
#include <stdio.h >
#include <winsock.h >
int main(int argc, char* argv[]) {
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saUdpServ;
BOOL fBroadcast = TRUE;
char sendBuff[1024];
int nSize;
int ncount=0;
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化
{
printf( "Can't initiates windows socket!Program stop.\n ");//初始化失败返回-1
return -1;
}
sockListener=socket(PF_INET,SOCK_DGRAM,0);
setsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST,
(CHAR *)&fBroadcast,sizeof ( BOOL ));
sin.sin_family = AF_INET;
sin.sin_port = htons(0);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR *)&sin, sizeof(sin))!=0)
{
printf( "Can't bind socket to local port!Program stop.\n ");//初始化失败返回-1
return -1;
}
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );
saUdpServ.sin_port = htons (7001);//发送用的端口,可以根据需要更改
nSize = sizeof ( SOCKADDR_IN );
while(1)
{
sprintf(sendBuff, "Message %d ",ncount++);
sendto ( sockListener,sendBuff,
lstrlen (sendBuff),
0,
(SOCKADDR *) &saUdpServ,
sizeof ( SOCKADDR_IN ));
printf( "%s\n ",sendBuff);
}
return 0;
}
///////////////////// //接收
#include <stdio.h >
#include <winsock.h >
#include <conio.h >
int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saClient;
char cRecvBuff[1024];
int nSize,nbSize;
int iAddrLen=sizeof(saClient);
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//进行WinSocket的初始化
{
printf( "Can't initiates windows socket!Program stop.\n ");//初始化失败返回-1
return -1;
}
sockListener=socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family = AF_INET;
sin.sin_port = htons(7001);//发送端使用的发送端口,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf( "Can't bind socket to local port!Program stop.\n ");//初始化失败返回-1
return -1;
}
while(1)
{
nSize = sizeof ( SOCKADDR_IN );
if((nbSize=recvfrom (sockListener,cRecvBuff,1024,0,
(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR)
{
printf( "Recive Error ");
break;
}
cRecvBuff[nbSize] = '\0';
printf( "%s\n ",cRecvBuff);
}
return 0;
}
http://ycjy.jsipt.edu.cn/jsjx/VC/NewUpdate/MFC_CPP/columnist_paper.pl-aid=unicode&pid=6.htm
TCP是面向流,面向连接的,很可靠,可以保证数据包顺序的收到,不会有丢包产生.
TCP保证数据的可靠传输,一般用于大量数据传输的应用中,每次连接都要确定一条数据链路开销比较大
而UDP只是尽力发送数据,并不保证对方一定收到(但可自己编程控制),一般用于需要多次传输数据但数据量并不大的应用中,比如QQ,ICQ
我也在学习网络编程,让我们共同进步,我的e-mail:[email protected]