用VScode 在Windows下写简单的socket通讯

用VScode 在Windows下写简单的socket通讯
最近在测试设备,需要用网口通信,第一次调试,中间遇到了很多问题,简单说一下吧。
(第一次发,如有问题,欢迎大家提出)
1、系统环境:Windows10;
2、编译环境:VScode最新版本
3、语言:C/C++
4、客户端例程
之前没有了解过socket通讯,在写例程的时候,查阅了很多资料,了解什么是客户端和服务端,此次我要用的仅是客户端。查询资料之后,自己试着写了一段,结果中间出了很多问题,下面一一进行展示:

问题1:编译,提示collect2.exe: error: ld returned 1 exit status

在这里插入图片描述
在这里插入图片描述

百度了很多,有的说是代码有问题,仔细检查了一遍代码,确保了没问题,然后换了编译器,使用Dev-C++编译,依然是这个结果,然后就继续找原因。

解决方案:

最后发现win下socket需要链接库,在Dev-C++,工具-》编译选项-》编译器
勾选 编译时加入以下命令
-lwsock32
在这里插入图片描述

Dev-C++环境下解决了,转过来说VScode,应该也是VScode的tasks.jion的配置有问题。之前是参考这篇文章,配置的C/C++编译环境:
链接: link.
然后就试着在tasks.jion文件里面加入一个“-lwsock32”,编译,无报错!
tasks.json代码如下:

// An highlighted block
{
    "version": "2.0.0",
    "command": "gcc",
    "args": [
        "-g",
        "${file}",
        "-o",
        "${fileBasenameNoExtension}.exe",
        "-lwsock32"  //正常编译是无此链接的
    ],
    "problemMatcher": {
        "owner": "cpp",
        "fileLocation": [
            "relative",
            "${workspaceRoot}"
        ],
        "pattern": {
            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5
        }
    }
}

问题2:#warning Please include winsock2.h before windows.h

前面链接好之后,编译虽然无报错,但是有警告

警告原因

WinSock2.h和windows.h发生冲突

发生冲突原因

windows.h里面包含了winsock.h,而winsock.h和WinSock2.h明显是冲突的。

解决办法

把windows.h放在WinSock2.h的后面。
但是我就是这样做的,还是不行,仔细阅读这句话,是我同时包含了winsock.h、WinSock2.h、windows.h,因此我去掉了winsock.h,警告解除。

#include <stdio.h>  
#include <stdlib.h>  
#include <errno.h>  
#include <string.h>
#include <winSock2.h>
#include <windows.h>
#include <sys/types.h>  
#pragma comment(lib,"Ws2.lib") //(lib,"Ws2_32.lib")

第一次做这方面,可能很小白,发出来提醒自己,同时,如有碰见相似问题的,可以参考;
第一次发文,如有不合适,不清楚地方,还望各位大佬不吝赐教,小白在此谢过!
附自己写的例程:

#include <stdio.h>  
#include <stdlib.h>  
#include <errno.h>  
#include <string.h>
#include <winSock2.h>
#include <windows.h>
#include <sys/types.h>  
#pragma comment(lib,"Ws2.lib") //(lib,"Ws2_32.lib")
int OpenTcp(int nMode,char *sParas)  //char *sDevInfo,int iComID,int iBaudrate
{
	WORD wVerisonRequested;
	WSADATA wsaData;
	SOCKET sockClient;
	unsigned char m_strIP[14];
	unsigned char m_strPort[4];
	int err;
	int length=0;
	if (nMode != 1)
	{
		return -1000;
	}
	length = strlen(sParas);
	for (int i = 0; i < length-5; i++)
	{
		m_strIP[i]=sParas[i];
	}

	wVerisonRequested = MAKEWORD(1,1);
	err = WSAStartup(wVerisonRequested, &wsaData);
	if (err != 0)
	{
		printf("连接失败");
		return err;
	}
	// create socket
	sockClient = socket(AF_INET, SOCK_STREAM, 0);
	
	
	// connect server socket
	struct sockaddr_in addrServer;
	addrServer.sin_addr.S_un.S_addr = inet_addr(m_strIP);
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(8000);//atoi(m_strPort)
	int ret = connect(sockClient, (struct sockaddr *)&addrServer, sizeof(addrServer));
	if (ret != 0)
	{
		printf("连接失败!");
		closesocket(sockClient);
		return -1002;
	}
	return sockClient;
}
int main()
{
	SOCKET handle;
	handle = OpenTcp(1,"192.168.1.100,8000");
	printf("OpenTcp = [%d]\n",handle);
	system("pause");
    return 0;
}
  • 22
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值