用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;
}