一个奇怪的socket问题

发布于 2021-11-14 13:49:05 字数 2258 浏览 961 评论 7

有一段代码,将其作为一个函数放入到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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

像你 2021-11-14 21:00:28

引用来自#4楼“ZYud”的帖子

引用来自#3楼“mallon”的帖子

是静态还是动态链接的CRT?如果是静态的,改成动态试试

拍不死你 2021-11-14 21:00:28

原来PF_INET=AF_INET

头文件里有这个定义.

这次看来是没有办法解决了.动态编译应该怎么做?

想挽留 2021-11-14 20:59:51

PF_INET的问题。AF_INET就OK了。

原程序是在linux下开发的,兼容性太好了,没有被发现。

不过windows下编成exe文件也没有问题,这个也挺怪。

贱贱哒 2021-11-14 20:57:12

winsock异步socket编程,谁能给个例子参考下?

现在就是不明白,同样的代码为什么做为exe文件就能执行正确?

凌乱心跳 2021-11-14 19:05:05

引用来自#3楼“mallon”的帖子

是静态还是动态链接的CRT?如果是静态的,改成动态试试

无边思念无边月 2021-11-14 19:00:36

是静态还是动态链接的CRT?如果是静态的,改成动态试试

凡尘雨 2021-11-14 17:49:50

而且我也尝试过telnet来测试,telnet可以正常连接。

是不是winsock有些全局的参数可以影响到调用的dll文件中socket连接。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文