初学winsock,疑问求解答
#undef UNICODE #include <stdio.h> /* for printf(), fprintf() */ #include <stdlib.h> /* for exit() */ #include <ws2tcpip.h> #define MAXPENDING 5 /* Maximum outstanding connection requests */ #pragma comment(lib,"ws2_32.lib") /* void PrintSocketAddr( const struct sockaddr *address){ switch(address->sa_family) { case AF_INET: printf( "IpV4n" ); break; case AF_INET6: printf( "IpV6n" ); break; } }*/ void main(int argc, char *argv[]) { int servSock; /* Socket descriptor for server */ int clntSock; /* Socket descriptor for client */ struct sockaddr_in echoServAddr; /* Local address */ struct sockaddr_in echoClntAddr; /* Client address */ unsigned short echoServPort; /* Server port */ int clntLen; /* Length of client address data structure */ WSADATA wsaData; /* Structure for WinSock setup communication */ if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */ { printf("初始化错误!"); exit(1); } if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ echoServAddr.sin_port = htons(atoi("778")); /* Local port */ if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) { printf("绑定失败!n"); } else { printf("绑定成功!n"); } struct addrinfo a; struct addrinfo *addrList; memset(&a,0,sizeof(a)); memset(&addrList,0,sizeof(addrList)); a.ai_family = AF_UNSPEC; a.ai_socktype = SOCK_STREAM; a.ai_protocol = IPPROTO_TCP; int rtnVal = getaddrinfo("localhost","43",&a,&addrList); if(rtnVal != 0) { printf("出错了!"); WSACleanup(); } struct addrinfo *addr = NULL; for( addr = addrList; addr != NULL; addr = addr->ai_next ); { switch(addr->ai_family) { case AF_INET: printf( "IPV4 n" ); break; case AF_INET6: printf( "IPV6 n" ); break; case AF_UNSPEC: printf( "未指定的n"); break; default: break; } } listen(servSock, MAXPENDING); for (;;) /* Run forever */ { clntLen = sizeof(echoClntAddr); if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) printf("Handling client %sn", inet_ntoa(echoClntAddr.sin_addr)); } /* NOT REACHED */ }
跟踪了一下switch里面会有
0x00413ce7 处有未经处理的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突
。。求原因
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
那没事了。
sh!t! 好奇害我运行了好多次这个代码,下次遇见这样的代码还是在异常前面设置断点,一步一步跟踪一下。大哥,下次写程序的时候还是多加小心点。
下面这句的分号不应该放在这里了。
struct
addrinfo *addrList;
memset
(&addrList,0,
sizeof
(addrList));
sizeof(
addrList
) = 4,本来
addrList就是指针为什么还要
&
addrList,
错误的根源就在这里,定义一个指针,没有指向任何空间,memset()函数肯定会出错的!!
多问一句,你用的是VC编译吗?源文件是不是保存为.c作为后缀?能照你这样编译下去吗?
没错就是这个分号郁闷了我半天。。
sh!t! 好奇害我运行了好多次这个代码,下次遇见这样的代码还是在异常前面设置断点,一步一步跟踪一下。大哥,下次写程序的时候还是多加小心点。
下面这句的分号不应该放在这里了。