奇怪的socket 10038错误

bj_leo_2000 2007-01-09 02:10:03
代码如下:
HANDLE ghController = NULL;
SOCKET gosocket = NULL;
unsigned int __stdcall WorkThread(void*);
int main(int argc, char* argv[])
{
SetConsoleTitle("HHTone服务器"); //设定
printf("服务器启动\r\n");
//初始化socket
WORD lwVersion;
WSADATA wsaData;
int err;

lwVersion = MAKEWORD(2,2);
err = WSAStartup( lwVersion, &wsaData );

if(err != 0)
{
printf("初始化socket库出错:%d\r\n",err);
return 0;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
printf("socket库版本错误\r\n");
WSACleanup();
return 0;
}
printf("初始化socket库成功\r\n");

printf("创建工作线程\r\n");
_beginthreadex(NULL,0,WorkThread,NULL,0,0);
//创建服务器循环等待
ghController = CreateEvent(NULL, FALSE, FALSE, NULL);
WaitForSingleObject(ghController,INFINITE);
//关闭服务器
if(gosocket != NULL)
closesocket(gosocket);
WSACleanup();
CloseHandle(ghController);
printf("服务器关闭");
return 0;
}
//---------------------------------------------------------------------------
unsigned int __stdcall WorkThread(void*)
{
sockaddr_in loaddr;
int loaddlen = 0;
char lacbuffer[MAX_PACKET_LENGTH]={0}; //接收数据线程
int liRet = 0;
liRet = recvfrom(gosocket,lacbuffer,MAX_PACKET_LENGTH,0,(sockaddr*)&loaddr,&loaddlen);
if(SOCKET_ERROR == liRet)
{
printf("接收数据失败:%d\r\n",GetLastError());
SetEvent(ghController);
return 0 ;
}
return 0;
}

recvfrom时返回错误,错误代码10038
...全文
8806 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuhuiwangluo 2012-02-19
  • 打赏
  • 举报
回复
同样的问题,求解啊。
zhozhoyu 2011-12-14
  • 打赏
  • 举报
回复
进来学习下!
盛夏 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kuiz422998 的回复:]
建议楼主单步调试下,看看gosocket是否为先前绑定的值。我也遇到相同的情况,一起解决啊
[/Quote]

正解!! 早没想到 要的就是这结果
  • 打赏
  • 举报
回复
你的socket一直都是个非法的值,你并没有调用socket()函数穿件socket
obarapin 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhouzhangkui 的回复:]
这些都没有socket(), bind(), listen(), accept()

C/C++ code

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#define PORT_SERVER 6656
#define NUM_CLIENTS 10
int main(int argc, char* a……
[/Quote]
这不是网上的一个很广泛转发的代码吗?
监听端口6656 最大连接10
连接时检测SOCKET版本是不是2.0
jdzfjfhnui 2011-05-06
  • 打赏
  • 举报
回复
要接收数据UDP发来的数据,必须先bind到发送端指定的端口
叶子 2011-03-04
  • 打赏
  • 举报
回复
断点调试一下..
周药师 2011-03-03
  • 打赏
  • 举报
回复
这些都没有socket(), bind(), listen(), accept()

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#define PORT_SERVER 6656
#define NUM_CLIENTS 10
int main(int argc, char* argv[])
{
std::cout << "Start up tcp server." << std::endl;

WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 0);
if (0 != WSAStartup(sockVersion, &wsaData))
{
std::cout << "Failed to retrive socket version."
<< std::endl;
return 0;
}
SOCKET sock_sev;
sock_sev = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock_sev)
{
std::cout << "Invalid socket." << std::endl;
WSACleanup();
return 0;
}
sockaddr_in addr_sev;
addr_sev.sin_family = AF_INET;
addr_sev.sin_port = htons(PORT_SERVER);
addr_sev.sin_addr.s_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(sock_sev, (sockaddr *)&addr_sev, sizeof(addr_sev)))
{
std::cout << "Failed to bind." << std::endl;
WSACleanup();
return 0;
}
if (SOCKET_ERROR == listen(sock_sev, NUM_CLIENTS))
{
std::cout << "Failed to listen." << std::endl;
WSACleanup();
return 0;
}
// 多路复用,暂时还未实现.后期会对此给出示例.
//fd_set reads;
//fd_set writes;
//fd_set accepts;
//FD_ZERO(&reads);
//FD_ZERO(&writes);
//FD_ZERO(&accepts);
//SOCKET sock_client;
sockaddr_in addr_client;
int nAddrLen = sizeof(addr_client);
while (true)
{
char tmp[512];
sock_client = accept(sock_sev, (sockaddr *)&addr_client, &nAddrLen);

if (INVALID_SOCKET == sock_client)
{
std::cout << "Failed to accept." << std::endl;
continue;
}
sprintf(tmp, "Your IP is %s\n", inet_ntoa(addr_client.sin_addr));
send(sock_client, tmp, strlen(tmp), 0);
std::cout << "Connection from " << inet_ntoa(addr_client.sin_addr)
<< std::endl;
closesocket(sock_client);
}

return 0;
}

暗风心 2011-02-21
  • 打赏
  • 举报
回复
gosocket在怎么弄的,都没有值。你要建立一个UDP的客户端socket,后才能用recvfrom。
baixs1987 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kuiz422998 的回复:]

建议楼主单步调试下,看看gosocket是否为先前绑定的值。我也遇到相同的情况,一起解决啊
[/Quote]正解,需要把SOCKET重新弄下。
东方有雨 2008-03-21
  • 打赏
  • 举报
回复
gosocket没有初始化嘛。还有好几步呢:socket(), bind(), listen(), accept()
kuiz422998 2008-03-18
  • 打赏
  • 举报
回复
建议楼主单步调试下,看看gosocket是否为先前绑定的值。我也遇到相同的情况,一起解决啊
sbkopoky 2007-02-17
  • 打赏
  • 举报
回复
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
wcpjavastudy 2007-01-10
  • 打赏
  • 举报
回复
邀请c/c++学习的各路好友加入c/c++学习群:17185131
alloutoflove 2007-01-09
  • 打赏
  • 举报
回复
缺少的初始化工作有好几步呢, 建议楼主找代码来参考一下!
alloutoflove 2007-01-09
  • 打赏
  • 举报
回复
10038说明你在非Socket上进行操作.
你的gosocket一直都没赋值, 一直为NULL...

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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