身边一非码农同事要实现这个功能,我从github上引用相关源码简单封装了一下,留帖以备后用。
应为写在一个函数里面,所以mode用来区分S和C,服务器端调用该函数需要新启用一个线程。
这个头文件,环境为VS,控制台程序即可。
#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <winsock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int cal(int mode/*0-server, 1-client*/,string ipAndPort/*server: port, client: ip:port */, string msg="") {
// parse mode and from argv
int error = 0;//syntax error
//parse ipaddr and port from argv
char* port = NULL;
unsigned long ipaddr = INADDR_ANY;
if (mode) {
ipaddr = inet_addr(strtok_s((char*)(ipAndPort.c_str()), ":", &port));
}
else {
port = (char*)(ipAndPort.c_str());
}
//init socket
WSADATA wsaData;
WORD socketVersion = MAKEWORD(2, 2);
if (WSAStartup(socketVersion, &wsaData) != 0)
{
printf("socket error occured");
return -1;
}
SOCKET msocket = socket(AF_INET, SOCK_DGR