初学winsock,疑问求解答

发布于 2021-11-15 16:39:32 字数 2785 浏览 771 评论 6

#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 技术交流群。

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

发布评论

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

评论(6

只为守护你 2021-11-17 00:59:55

那没事了。

醉生梦死 2021-11-17 00:47:21

sh!t! 好奇害我运行了好多次这个代码,下次遇见这样的代码还是在异常前面设置断点,一步一步跟踪一下。大哥,下次写程序的时候还是多加小心点。

下面这句的分号不应该放在这里了。

for( addr = addrList; addr != NULL; addr = addr->ai_next );

彼岸花ソ最美的依靠 2021-11-17 00:38:01

struct addrinfo *addrList;

memset(&addrList,0,sizeof(addrList));

sizeof(addrList) = 4,本来addrList就是指针为什么还要&addrList,错误的根源就在这里,定义一个指针,没有指向任何空间,memset()函数肯定会出错的!!

牵你的手,一向走下去 2021-11-16 20:56:51

多问一句,你用的是VC编译吗?源文件是不是保存为.c作为后缀?能照你这样编译下去吗?

冷默言语 2021-11-16 18:48:31

没错就是这个分号郁闷了我半天。。

毁梦 2021-11-16 00:08:25

sh!t! 好奇害我运行了好多次这个代码,下次遇见这样的代码还是在异常前面设置断点,一步一步跟踪一下。大哥,下次写程序的时候还是多加小心点。

下面这句的分号不应该放在这里了。

for( addr = addrList; addr != NULL; addr = addr->ai_next );

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