sendto为什么总是返回失败

采石工 2011-04-05 01:34:44
劳烦各位大大,看一下下面的程序,sendto为什么总是返回失败

#include <winsock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")

DWORD WINAPI RecvDataThread(LPVOID lpParameter);
DWORD WINAPI SendDataThread(LPVOID lpParameter);
HANDLE hThread1;
HANDLE hThread2;

SOCKET g_sConnect;
SOCKADDR_IN g_aLocal;
SOCKADDR_IN g_aRemote;
CRITICAL_SECTION g_cs;
int len = sizeof(SOCKADDR);

BOOL InitSocket()
{
WORD wVersionRequested=MAKEWORD(2,2);
WSADATA wsaData;

if( WSAStartup(wVersionRequested, &wsaData) != 0)
{
return FALSE ;
}

if( LOBYTE( wsaData.wVersion) != 2 || HIBYTE( wsaData.wVersion) !=2 )
{
WSACleanup();
return FALSE;
}

SOCKET g_sConnect = socket(AF_INET,SOCK_DGRAM, 0 );

g_aLocal.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
g_aLocal.sin_family = AF_INET;
g_aLocal.sin_port = htons(6100);

g_aRemote.sin_addr.S_un.S_addr = inet_addr("202.38.64.111");
g_aRemote.sin_family = AF_INET;
g_aRemote.sin_port = htons(6101);

bind(g_sConnect,(struct sockaddr*)&g_aLocal,sizeof(g_aLocal));

return TRUE;
}

int main(int argc, char* argv[])
{
if (InitSocket())
{
InitializeCriticalSection(&g_cs);
printf("套接字初始化成功!\n\n");
hThread1=CreateThread(NULL,0,SendDataThread,NULL,0,NULL);
hThread2=CreateThread(NULL,0,RecvDataThread,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
}
else
{
printf("套接字初始化失败!\n");
return 1;
}

while(1)
{
}

closesocket(g_sConnect);
WSACleanup();
DeleteCriticalSection(&g_cs);

return 0;
}

DWORD WINAPI SendDataThread(LPVOID lpParameter)
{
while(1)
{
char sendBuf[1000]="";

EnterCriticalSection(&g_cs);
Sleep(1000);

printf("Please input data:\n");
gets(sendBuf);

if(sendto(g_sConnect,sendBuf, strlen(sendBuf )+1, 0 ,(SOCKADDR*)&g_aRemote, len)!=SOCKET_ERROR)
{
printf("sendto success!\n");
}
else
{
printf("sendto failure!\n");
}

LeaveCriticalSection(&g_cs);
}

return 0;
}

DWORD WINAPI RecvDataThread(LPVOID lpParameter)
{
while(1)
{
char recvBuf[1000]="";
char tempBuf[1000]="";

EnterCriticalSection(&g_cs);
Sleep(1000);

if( recvfrom(g_sConnect, recvBuf, 1000, 0, (SOCKADDR*)&g_aRemote,&len)!=SOCKET_ERROR)
{
sprintf(tempBuf, "%s say:\n%s", inet_ntoa(g_aLocal.sin_addr), recvBuf);
printf("%s\n", tempBuf);
}
else
{
printf("recvfrom failure!\n");
}

LeaveCriticalSection(&g_cs);
}

return 0;
}
...全文
541 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuiyuezhou888 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 quarryman 的回复:]
引用 7 楼 zuiyuezhou888 的回复:

还有你sendto()和recvfrom()都调用的g_sConnect,自己给自己发没有意义啊
为什么不写一个客户端呢,哥们?

我写的是一个对等的UDP连接,也就没有客户端和服务器端的区别。由于在本机测试,不如用一个程序实现自己收发,这样方便些吧!附:我没有这方面的经验,见笑了!
[/Quote]
UDP没有客户端与服务器的区别?udp不用listen()和connect()
udp的服务器还是需要bind()来帮顶端口的,客户端不需要bind()
慢慢来 找本书看吧
zuiyuezhou888 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 quarryman 的回复:]
引用 6 楼 zuiyuezhou888 的回复:

你在调用的sendto的时候是不是已经锁住g——cs,
那程序还能跑到recvfrom中吗?
所以发送失败了,然后返回错误

谢谢你,我已经知道是什么原因了,可是如何修改呢?
[/Quote]
在写一个客户端程序
采石工 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zuiyuezhou888 的回复:]

还有你sendto()和recvfrom()都调用的g_sConnect,自己给自己发没有意义啊
为什么不写一个客户端呢,哥们?
[/Quote]
我写的是一个对等的UDP连接,也就没有客户端和服务器端的区别。由于在本机测试,不如用一个程序实现自己收发,这样方便些吧!附:我没有这方面的经验,见笑了!
采石工 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zuiyuezhou888 的回复:]

你在调用的sendto的时候是不是已经锁住g——cs,
那程序还能跑到recvfrom中吗?
所以发送失败了,然后返回错误
[/Quote]
谢谢你,我已经知道是什么原因了,可是如何修改呢?
zuiyuezhou888 2011-04-05
  • 打赏
  • 举报
回复
还有你sendto()和recvfrom()都调用的g_sConnect,自己给自己发没有意义啊
为什么不写一个客户端呢,哥们?
zuiyuezhou888 2011-04-05
  • 打赏
  • 举报
回复
你在调用的sendto的时候是不是已经锁住g——cs,
那程序还能跑到recvfrom中吗?
所以发送失败了,然后返回错误
采石工 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 aaadddzxc 的回复:]

接受和发送不要使用同一个 临界区。。你发送完成后才会离开,服务端发送和客户端接受是同步工作的。。。你把接受和发送临界区资源换成不同的试试
[/Quote]
你好,这样和不使用临界区应该没有什么区别吧!我遵照你的建议,将程序改为如下的代码。可是人就有问题啊!

#include <winsock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")

DWORD WINAPI RecvDataThread(LPVOID lpParameter);
DWORD WINAPI SendDataThread(LPVOID lpParameter);
HANDLE hThread1;
HANDLE hThread2;

SOCKET g_sConnect;
SOCKADDR_IN g_aLocal;
SOCKADDR_IN g_aRemote;
CRITICAL_SECTION g_csRecv;
CRITICAL_SECTION g_csSend;
int len = sizeof(SOCKADDR);

BOOL InitSocket()
{
WORD wVersionRequested=MAKEWORD(2,2);
WSADATA wsaData;

if( WSAStartup(wVersionRequested, &wsaData) != 0)
{
return FALSE ;
}

if( LOBYTE( wsaData.wVersion) != 2 || HIBYTE( wsaData.wVersion) !=2 )
{
WSACleanup();
return FALSE;
}

SOCKET g_sConnect = socket(AF_INET,SOCK_DGRAM, 0 );

g_aLocal.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
g_aLocal.sin_family = AF_INET;
g_aLocal.sin_port = htons(6101);

g_aRemote.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
g_aRemote.sin_family = AF_INET;
g_aRemote.sin_port = htons(6100);

bind(g_sConnect,(struct sockaddr*)&g_aLocal,sizeof(g_aLocal));

return TRUE;
}

int main(int argc, char* argv[])
{
if (InitSocket())
{
InitializeCriticalSection(&g_csRecv);
InitializeCriticalSection(&g_csSend);
printf("套接字初始化成功!\n\n");
hThread1=CreateThread(NULL,0,SendDataThread,NULL,0,NULL);
hThread2=CreateThread(NULL,0,RecvDataThread,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
}
else
{
printf("套接字初始化失败!\n");
return 1;
}

while(1)
{
}

closesocket(g_sConnect);
WSACleanup();
DeleteCriticalSection(&g_csRecv);
DeleteCriticalSection(&g_csSend);

return 0;
}

DWORD WINAPI SendDataThread(LPVOID lpParameter)
{
while(1)
{
char sendBuf[1000]="";

EnterCriticalSection(&g_csSend);
Sleep(1000);

printf("Please input data:\n");
gets(sendBuf);

if(sendto(g_sConnect,sendBuf, strlen(sendBuf )+1, 0 ,(SOCKADDR*)&g_aRemote, len)!=SOCKET_ERROR)
{
printf("sendto success!\n");
}
else
{
printf("sendto failure!\n");
}

LeaveCriticalSection(&g_csSend);
}

return 0;
}

DWORD WINAPI RecvDataThread(LPVOID lpParameter)
{
while(1)
{
char recvBuf[1000]="";
char tempBuf[1000]="";

EnterCriticalSection(&g_csRecv);
Sleep(1000);

if( recvfrom(g_sConnect, recvBuf, 1000, 0, (SOCKADDR*)&g_aRemote,&len)!=SOCKET_ERROR)
{
sprintf(tempBuf, "%s say:\n%s", inet_ntoa(g_aLocal.sin_addr), recvBuf);
printf("%s\n", tempBuf);
}
else
{
printf("recvfrom failure!\n");
}

LeaveCriticalSection(&g_csRecv);
}

return 0;
}
xengine-qyt 2011-04-05
  • 打赏
  • 举报
回复
接受和发送不要使用同一个 临界区。。你发送完成后才会离开,服务端发送和客户端接受是同步工作的。。。你把接受和发送临界区资源换成不同的试试
采石工 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zuiyuezhou888 的回复:]

大哥 你发送的时候已经锁住了g_cs,没发送完 就打不开锁,怎么 recvfrom?
[/Quote]
你好,我发送之后,不是已经LeaveCriticalSection()了吗?
zuiyuezhou888 2011-04-05
  • 打赏
  • 举报
回复
你可以在写一个客户端,给客户端发肯定没问题
zuiyuezhou888 2011-04-05
  • 打赏
  • 举报
回复
大哥 你发送的时候已经锁住了g_cs,没发送完 就打不开锁,怎么 recvfrom?

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧