突然间,
socket
在gdb下崩溃了(但正常情况下运行良好)。只有当我初始化winsock时才会出现这种情况。非常感谢您的任何帮助。#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <winsock2.h>
#include <Iphlpapi.h>
#ifdef _MSC_VER
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "IPHLPAPI.lib")
#endif
#include <windows.h>
unsigned char Network_isInitialized_ = 0;
#define SYSTEMINFORMATION_ISNATIVEWINDOWS 1
unsigned char Network_init_(){
#if SYSTEMINFORMATION_ISNATIVEWINDOWS
if (Network_isInitialized_){
return Network_isInitialized_;
}
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
Network_isInitialized_ = error == 0 ? 1 : 0;
return Network_isInitialized_;
#else
return 1;
#endif
}
void Network_shutdown_(){
#if SYSTEMINFORMATION_ISNATIVEWINDOWS
if (Network_isInitialized_){
WSACleanup(); //Clean up Winsock
}
Network_isInitialized_ = 0;
#else
//Unix doesnt need to do anything
#endif
}
typedef struct TCP_Connection_s {
char *name;
int port;
unsigned int ip;
struct sockaddr_in *connection;
void *ptr;
unsigned int socket;
} TCP_Connection;
TCP_Connection* TCP_Connection_malloc(){
TCP_Connection *connection = (TCP_Connection*)malloc(sizeof(TCP_Connection));
memset(connection, 0, sizeof(*connection));
connection->connection = (struct sockaddr_in*) malloc (sizeof(struct sockaddr_in));
memset(connection->connection, 0, sizeof(*connection->connection));
return connection;
}
TCP_Connection* myconnect(TCP_Connection *connection){
if (connection == NULL){
return NULL;
}
connection->socket = socket(AF_INET, SOCK_STREAM, 0);
if (connection->socket+1 == 0){
return NULL;
}
int ret = connect(connection->socket, (struct sockaddr *)connection->connection, sizeof(*connection->connection));
if (ret != 0){
return NULL;
}
return connection;
}
TCP_Connection* connectToHost(TCP_Connection *connection, char *address, int port){
if (address == NULL){
return NULL;
}
if (connection == NULL){
connection = TCP_Connection_malloc();
}
struct hostent *he = (struct hostent *) gethostbyname(address);
int retryCount = 5;
while (he == NULL && retryCount > 0){
he = (struct hostent *) gethostbyname(address);
Sleep(2000);
retryCount = retryCount - 1;
}
if (he == NULL){
return NULL;
}
struct sockaddr_in temp;
memcpy(&(temp.sin_addr), he->h_addr, he->h_length);
connection->connection->sin_family = AF_INET;
connection->connection->sin_addr.s_addr = INADDR_ANY;
connection->connection->sin_port = htons(port);
connection->port = port;
memcpy(&(connection->connection->sin_addr), he->h_addr, he->h_length);
return myconnect(connection);
}
int main(int argc, char *argv[]){
//Random_seedCryptographic();
Network_init_();
connectToHost(NULL, "localhost", 1337);
Network_shutdown_();
printf("Press any key to continue...");
fflush(0);
getchar();
return 0;
}
$ gdb test.exe GNU gdb (GDB) 7.3.50.20111026-cvs (cygwin-special) 版权所有 (C) 2011 自由软件基金会, Inc. 许可证 GPLv3 +: GNU GPL 版本 3 或更高版本 这是自由软件: 您可以自由更改和重新分发它。 在法律允许的范围内没有保修。键入“show copying” 和“show warranty”了解详细信息。 此 GDB 已配置为“i686-cygwin”。 有关错误报告说明,请参见: ... 正在从 /cygdrive/c/test.exe 读取符号...完成。 (gdb) run 启动程序:/cygdrive/c/test.exe [New Thread 201280.0x60b68] dll 路径太长 [New Thread 201280.0x304b0] 警告: 无法加载 //./globalroot/systemroot/syswow64/mswsock.dll 的共享库符号。 您需要“set solib-search-path”或“set sysroot”吗?
程序收到 SIGTRAP 信号,跟踪/断点陷阱。 0x3567125a in ?? () from /cygdrive/c/Windows/syswow64/mswsock.dll (gdb) bt #0 0x3567125a in ?? () from /cygdrive/c/Windows/syswow64/mswsock.dll #1 0x753b8b9d in inet_ntoa () from /cygdrive/c/Windows/syswow64/WS2_32.dll #2 0x753b8972 in inet_ntoa () from /cygdrive/c/Windows/syswow64/WS2_32.dll #3 0x753b89da in inet_ntoa () from /cygdrive/c/Windows/syswow64/WS2_32.dll #4 0x753b3d70 in WSCInstallProvider () from /cygdrive/c/Windows/syswow64/WS2_32.dll #5 0x00000002 in ?? () #6 0x00000001 in ?? () #7 0x00000000 in ?? ()
更新:我尝试在另一个使用mingw portable的系统上编译同一文件,它可以工作。然后我尝试在我的系统上安装mingw并卸载cygwin...还是不行XD
gdb
告诉你的内容吗:你需要“set solib-search-path”或“set sysroot”吗?
- Nikolai FetissovTCP_Connection_s
结构体中的connection
成员是指针。当你需要一个指向它的指针时,你可以使用取地址符(&
)。 - Some programmer dudecontinue
会发生什么? - Yam Marcovic