【发布时间】:2015-06-09 16:41:10
【问题描述】:
我从事 Unix 程序员已经有很长一段时间了,我非常了解系统的套接字 API,我主要将它用于网络。
问题是我目前正在尝试创建一个跨平台软件,所以我开始学习如何将我的源代码编译成 windows 可执行文件。
我创建了一个startup() 函数,它做最简单的事情:连接到一个服务器(给定IP),失败时返回-1。在 Linux 上,我的代码运行流畅,但在 Windows(7) 上,我在某些机器上遇到同样的错误 - “Connect()”函数失败,errno: “Result too large”(据我了解)意味着它找不到任何在该 IP 上侦听服务器,但在其他 IP 上运行良好。
代码如下(win版):
#define _WIN32_WINNT 0x0501
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <windows.h>
#include <winsock.h>
#define ADDR "127.127.127.127"
#define PORT 8752
int startup(struct sockaddr_in sin)
{
int sockfd, soaddr;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
fprintf(stderr, "socket:%s\n", strerror(errno));
return(-1);
}
soaddr = sizeof(sin);
if(connect(sockfd, (struct sockaddr*)&sin, soaddr) == -1)
{
fprintf(stderr, "connect:%s\n", strerror(errno));
return(-1);
}
return sockfd;
}
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(ADDR);
sockfd = startup(sin);
// Code continues
return(0);
}
注意:出于隐私原因,ADDR 已更改,但该机器上有一个工作服务器
那么,我到底为什么会收到这个错误?
【问题讨论】:
-
我不确定 WSA 的
socket函数会更改errno。errno是 C/C++ 运行时库工件,系统 API 函数不太可能对其进行更改。 Documentation 指定需要调用WSAGetLastError获取错误代码。 -
WinSock 根本不使用
errno。WSAGetLastError()(在某些情况下,getsockopt(SO_ERROR))是获取 WinSock 错误代码的方法
标签: c windows sockets networking