我用udp做了广播收发的程序。接收程序和别人的程序对接都没有问题,大到2400字节的数据都能正常接收。自己的udp广播发送程序单独发送,用抓包器观测也正常发送。问题是当用自己的udp广播发送程序发送超过1500字节时,自己的udp接收程序就不响应FD_READ消息了。特请教。
我的udp发送程序如下:
SOCKET s;
SOCKADDR_IN addrto;
WSADATA wsdata;
BOOL bsocket;
int count = 0;
//启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);

s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED); addrto.sin_family=AF_INET;
    addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
addrto.sin_port=htons((unsigned short)5050); int nlen = sizeof(addrto); //设置该套接字为广播类型
BOOL  bBroadcast=TRUE; 
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL)); int nSendBuf=10*1024;//设置为10K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
int value, len=sizeof(value);
getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&value, &len);
CFile  f;
f.Open("D:\\recvdb.dat", CFile::modeRead);
byte ch[20];
char buf[10240];
int co = 0;
bool b = true;
byte oldch=0;
while(b)
{
int ret; int r = 0;
r = f.Read(ch,1);
if(r < 1) {
b = false;
m_s.SetWindowText("file is read all.");
}else {
if((ch[0] == 0xff) && (oldch == 0xff)) {
Sleep(200);
ret = sendto(s, buf, co-2, 0, (sockaddr*)&addrto, nlen);
co = 0;
memset(buf, 0, 10240);
memset(ch, 0, 20);
oldch = 0;
TRACE("send\n");
if(ret==SOCKET_ERROR) {
CString str;
str.Format("%d",WSAGetLastError());
m_s.SetWindowText((LPCTSTR)str);
}
} else {
buf[co++] = ch[0];
oldch = ch[0];
TRACE("co=%d\n",co);
}
}
} 我的udp接收程序如下: h_sock = socket(AF_INET,SOCK_DGRAM,0); BOOL  bBroadcast=TRUE; 
ret = setsockopt(h_sock,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL)); int nSendBuf=10*1024;//设置为10K
setsockopt(h_sock,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int)); int nRecvBuf=20*1024;//设置为20K
ret = setsockopt(h_sock, SOL_SOCKET, SO_RCVBUF, (const char *)&nRecvBuf,sizeof(nRecvBuf)); int value, len=sizeof(value);
getsockopt(h_sock, SOL_SOCKET, SO_SNDBUF, (char*)&value, &len);
getsockopt(h_sock, SOL_SOCKET, SO_RCVBUF, (char*)&value, &len); RevFromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
RevFromAddr.sin_family = AF_INET;
RevFromAddr.sin_port = htons((unsigned short)5050); ret = bind(h_sock,(SOCKADDR*)&RevFromAddr,sizeof(RevFromAddr));
if(ret == SOCKET_ERROR) {
int j=0;
} if(NULL != hWnd) {
WSAAsyncSelect(h_sock, hWnd, WM_SOCKET, FD_READ);
} switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
memset(recvdata, 0, DATA_BUFSIZE);
//len = recv(h_sock, recvdata, DATA_BUFSIZE, 0);
len = recv(h_sock, recvdata, DATA_BUFSIZE, 0); int j = len; if(len >= 0) {
str.Format("len=%d,con=",len);
for(int i=0; i<len; i++) {
tem.Format("%d ",recvdata[i]);
str += tem;
}
str += "\r\n";
recvfile.Write((LPCTSTR)str, str.GetLength());
recvdata[i+1] = 0xff;
recvdata[i+2] = 0xff;
recvf.Write(recvdata, len+3);
translate(); }