您的位置:首页 > 编程语言

MinGW WinSockets 编程

2015-08-05 09:53 120 查看
前言:

大一的时候一个学长给我推荐MinGW(Minimalist GNUfor Windows) Developer Studio,后来就一直用了下去,感觉比VC++和DEV C好用,比VS更轻量级吧。

最近需要写一个简单的winsockets Client 来测试服务器,发现编译问题。

客户端代码:

#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define PORT 5154
#define IP_ADDRESS "127.0.0.1"

int main(int argc, char * argv[])
{
	WSADATA Ws;
	SOCKET ClientSocket;
	struct sockaddr_in ServerAddr;
	int Ret = 0;
	int AddrLen = 0;
	HANDLE hThread = NULL;
	char SendBuffer[MAX_PATH];
	if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
	{
		cout << "Init Windows Socket Failed::" << GetLastError() << endl;
		return -1;
	}
	
	ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ClientSocket == INVALID_SOCKET)
	{
		cout << "Create Socket Failed::" << GetLastError() << endl;
		return -1;
	}

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
	ServerAddr.sin_port = htons(PORT);
	memset(ServerAddr.sin_zero, 0x00, 8);

	Ret = connect(ClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
	if (Ret == SOCKET_ERROR)
	{
		cout << "Connect Error::" << GetLastError() << endl;
		return -1;
	}
	while (true)
	{
		cout << "Please input Message:"<<endl;
		cin.getline(SendBuffer, sizeof(SendBuffer));
		Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
		if (Ret == SOCKET_ERROR)
		{
			cout << "Send Info Error::" << GetLastError() << endl;
			break;
		}
	}

	closesocket(ClientSocket);
	WSACleanup();

	return 0;
}
简单分析一下代码:

1.WSAStartup完成Winsocket服务初始化

2.创建套接字

3.设置服务器网络参数

4.发起连接

5.发送数据

6.关闭套接字关闭Winsockets服务

这里出现的问题,在MinGW Studio下编译通过但是在Link(链接)的时候会报错:

undefined reference to `WSAStartup@8'

undefined reference to xxxxxxx

网上有这样的解决方案

在代码前面加上:

#pragma comment(lib, "ws2_32.lib")


发现并没有什么作用。

后来得知,MinGW没有#pragma comment这样的预处理命令。

最终解决办法

project -> settings -> links -> Extra linking options

加上:-lws2_32

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: