客户端发送UDP包,在接收端用抓包工具可以抓到包,而且数据内容也对,但是用recvfrom接收时程序停在recvfrom处
大家好,我在进行网络编程时
客户端发送UDP包,在接收端用抓包工具可以抓到包,而且数据内容也对,但是用recvfrom接收时程序停在recvfrom处,一直执行不下去了,这是什么原因,求解? 我在一个套接字上绑定了三个线程,分别用于发送不同的数据
附上我客户端和服务器端的程序?
//服务器端
struct protoent *protoin; //协议有关类
struct sockaddr_in ipaddr; //地址
struct hostent *hostin; //主机
struct servent *servin; //服务器
int sock, type;
int nErrCode;
int uiRcvBuf; //接收缓存
int uiRcvBufLen = sizeof(uiRcvBuf); //接收缓存长度
int uiNewRcvBuf;
memset(&ipaddr,0,sizeof(ipaddr)); //清零
ipaddr.sin_family=AF_INET;
if(servin=getservbyname(service,transport))
ipaddr.sin_port=servin->s_port;
else if((ipaddr.sin_port=htons((u_short)atoi(service)))==0)
{
printf("get server information error\n");
WSACleanup();
exit(1);
}
if((protoin=getprotobyname(transport))==0)
{
printf("get protocol information error \n");
WSACleanup();
exit(1);
}
int a=WSAGetLastError();
if(hostin=gethostbyname(host))
memcpy (&ipaddr.sin_addr,hostin->h_addr,hostin->h_length);
else if ((ipaddr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
{
printf("get host IP information error\n");
WSACleanup();
exit(1);
}
if (strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
sock=socket(AF_INET,type,protoin->p_proto); //创建套接字
nErrCode = getsockopt(sock,SOL_SOCKET,SO_SNDBUF,(char *)&uiRcvBuf,&uiRcvBufLen);
uiRcvBuf *= 30; //接收缓存,30有何意义?
nErrCode = setsockopt(sock,SOL_SOCKET,SO_SNDBUF,(char *)&uiRcvBuf,uiRcvBufLen);
getsockopt(sock,SOL_SOCKET,SO_SNDBUF,(char *)&uiNewRcvBuf,&uiRcvBufLen);
SOCKADDR_IN addrFrom;
addrFrom.sin_family=AF_INET;
addrFrom.sin_port=htons(6000);
addrFrom.sin_addr.S_un.S_addr=inet_addr(local_ip);
//绑定到本地ip地址和端口
int ret_val = bind(sock, (SOCKADDR*)&addrFrom,sizeof(SOCKADDR));//若无错误,则返回0
if(connect(sock,(struct sockaddr *)&ipaddr, sizeof(ipaddr))==SOCKET_ERROR)
{
printf("connect socket error! please start server first\n");
WSACleanup();
exit(1);
}
bytes=send(p->mSocket,send_buf,1285,0);
接收端
//创建套接字
mSocket1=socket(AF_INET,SOCK_DGRAM,0);
//获取套接字参数
nErrCode1 = getsockopt(mSocket1,SOL_SOCKET,SO_RCVBUF,(char *)&uiRcvBuf1,&uiRcvBufLen1);
uiRcvBuf1 *= 1000;
//设置套接字参数
nErrCode1 = setsockopt(mSocket1,SOL_SOCKET,SO_RCVBUF,(char *)&uiRcvBuf1,uiRcvBufLen1);
getsockopt(mSocket1,SOL_SOCKET,SO_RCVBUF,(char *)&uiNewRcvBuf1,&uiRcvBufLen1);
//绑定套接字
nErrCode1=bind(mSocket1,(struct sockaddr*)&ipaddr1,sizeof(ipaddr1));
//socket接收数据
recvlength1=recvfrom(m_RceLoop->mSocket1,(char*)recv_buf1,1024,0,
(LPSOCKADDR) &addr_cli, (int *) &addr_cli_len);