关于扩展DLL中Socket(10038)的问题。
my15y 2005-02-14 11:12:55 我在扩展dll中使用winsock但是返回10038错误,说:描述符不是套接字 但我定义的SOCKET s 确实没错。并在win32 exe中测试通过。以下是函数部分:并在头文件中也包含winsock.h 和lib
FtpStart(CString hostname, CString FilePath, CString FileName, int Port, int ThreadNumber, CString SaveTo)
{
char buf[bufsize];
WORD wVersionRequested;
WSADATA wsaData;
int sockerror;
wVersionRequested=MAKEWORD(1,1);
sockerror=WSAStartup(wVersionRequested,&wsaData);
if (sockerror !=0) {
AfxMessageBox("WinSock初始化失败");
WSACleanup();
exit(1);
}
if (LOBYTE(wsaData.wVersion) !=1 || HIBYTE(wsaData.wVersion) !=1)
{
AfxMessageBox("您的系统不支持winsock1。1版");
WSACleanup();
exit(1);
}
SOCKET s;
if (s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) ==SOCKET_ERROR) {
AfxMessageBox("Socket创建失败");
WSACleanup();
exit(1);
}
int bNodelay = 1;
/*if (setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char *) &bNodelay,sizeof(bNodelay)) ==SOCKET_ERROR) {
AfxMessageBox("Socket设定失败");
WSACleanup();
exit(1);
}*/
sockaddr_in addr;
sockaddr_in ServAddr;
addr.sin_family=AF_INET;
addr.sin_port=0;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
/*if (bind(s,(LPSOCKADDR)&addr,sizeof(addr)) ==SOCKET_ERROR) {
printf("bind错误");
exit(1);
}*/
ServAddr.sin_port=htons(Port);
ServAddr.sin_family=AF_INET;
/*sockaddr_in sa;
CString ServIP;
struct hostent *phe;
if (phe=gethostbyname(hostname)) {
for (int nAdapter=0; phe->h_addr_list[nAdapter]; nAdapter++) {
memcpy (&sa.sin_addr.S_un.S_addr,phe->h_addr_list[nAdapter],phe->h_length);
}
}
else {
AfxMessageBox("无法解析主机名"+hostname);
WSACleanup();
exit(1);
}
ServIP=inet_ntoa(sa.sin_addr);
*/
ServAddr.sin_addr.S_un.S_addr=inet_addr(ServIP);
if (connect(s,(LPSOCKADDR)&ServAddr,sizeof(ServAddr))==SOCKET_ERROR) {
AfxMessageBox("无法连接到主机");
WSACleanup();
exit(1);
}
CString Rmsg;
Rmsg=OnRecv(s,buf);
return 0;
}