一个奇怪的socket问题
有一段代码,将其作为一个函数放入到dll文件时,connect会出现失败,WSAGetLastError返回代码为10060,我查的结果是超时。
http://msdn.microsoft.com/en-us/library/ms740668%28v=vs.85%29.aspx
但我单独写成一个文件,编译成exe文件执行时就可以连接成功。
不知道大家有没有遇到过这种情况?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <winsock2.h>
void wlog(const char* l){ FILE *f=fopen("log.txt", "a+"); int le=strlen(l); fwrite(l, le, 1, f); fclose(f); }
int iRes=0; int ret = -1; int sock = 0; WORD wVersionReq; WSADATA wsad; struct sockaddr_in servername; int tmpl=sizeof (servername); wVersionReq=MAKEWORD(2, 0); iRes=WSAStartup(wVersionReq, &wsad); if(iRes!=0){ wlog("sock init errn"); WSACleanup(); return (ret); } //init sock sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { wlog("sock init errn"); WSACleanup(); return (ret); } servername.sin_family = AF_INET; servername.sin_port = htons(port); servername.sin_addr.S_un.S_addr= inet_addr(host); /* //init connect addr ret = init_sockaddr(&servername, host, port); if (ret != 0) { wlog("addr errn"); WSACleanup(); return (ret); } //*/ //* int itimeout=6000; if(setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&itimeout, sizeof(itimeout))==SOCKET_ERROR){ char tmp [10]; sprintf(tmp, "%d", WSAGetLastError()); wlog("set sock recv errn"); wlog(tmp); WSACleanup(); return (ret); } if(setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&itimeout, sizeof(itimeout))==SOCKET_ERROR){ char tmp [10]; sprintf(tmp, "%d", WSAGetLastError()); wlog("set sock send errn"); wlog(tmp); WSACleanup(); return (ret); } //*/ //connect ret = connect(sock, (struct sockaddr*) &servername, tmpl); if (ret == SOCKET_ERROR ) { char tmp [10]; sprintf(tmp, "%d", WSAGetLastError()); wlog("connect errn"); wlog(tmp); WSACleanup(); return (ret); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
引用来自#4楼“ZYud”的帖子
引用来自#3楼“mallon”的帖子
是静态还是动态链接的CRT?如果是静态的,改成动态试试
原来PF_INET=AF_INET
头文件里有这个定义.
这次看来是没有办法解决了.动态编译应该怎么做?
PF_INET的问题。AF_INET就OK了。
原程序是在linux下开发的,兼容性太好了,没有被发现。
不过windows下编成exe文件也没有问题,这个也挺怪。
winsock异步socket编程,谁能给个例子参考下?
现在就是不明白,同样的代码为什么做为exe文件就能执行正确?
引用来自#3楼“mallon”的帖子
是静态还是动态链接的CRT?如果是静态的,改成动态试试
是静态还是动态链接的CRT?如果是静态的,改成动态试试
而且我也尝试过telnet来测试,telnet可以正常连接。
是不是winsock有些全局的参数可以影响到调用的dll文件中socket连接。