这是自己写的一个简单socket通信函数,作为客户端在c++中生产环境已经使用,哪里有问题还请大家指出,作为笔记会持续更新
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#include <Winsock2.h> //windows socket的头文件
#pragma comment( lib, "WS2_32.lib" )// 链接Winsock2.h的静态库文件
using namespace std;
static int longth = 1024 * 1024 *2;//一次接受数据最大长度
char rec[1024 * 1024 *2 ];//分配2M内存,作为接受数据的最大容量,可根据自己的需求调整,尽量越小越好
//在此注意rec的数组长度和longth的值相等,不然接受数据会乱码错误
// 1.对socket数据接受的处理
char* Transport(byte *message)
{
rec[0] = '\0';
WORD wVersionRequested;
WSADATA wsaData;
int err;
const int BUFFER_SIZE = 512;
wVersionRequested = MAKEWORD(1, 1);
char *MESSAGE;
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return "socket_flase";
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return false;
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建套接字(socket)。
SOCKADDR_IN local;
local.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
local.sin_family = AF_INET;
local.sin_port = htons(8080);
if (sockClient == INVALID_SOCKET) //判断soket是否创建成功
{
MessageBox(NULL, "连接服务器失败,请重试", TEXT("发送信息"), MB_ICONINFORMATION);
return "pp";
}
if (connect(sockClient, (struct sockaddr *) &local, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)//判断链接是否成功
{
printf("连接失败\r\n");
//btnconn->EnableWindow(TRUE);
return "asd";
}
else
{
printf("连接成功\r\n");
}
int len = sizeof(SOCKADDR);
//byte sendBuf[1024] = message;
send(sockClient, (const char*)message, strlen((const char*)message), 0);
char recvBuf[BUFFER_SIZE]="";
//const char *ptr = recvBuf;
int num = 0;
//判断是否接收完整
while (num = recv(sockClient, rec, longth, 0) >0)
{
//link_M(rec, recvBuf);
//数据的拼接,最后的数据都在rec中
if(recvBuf!=NULL)
sprintf(rec, "%s%s", rec, recvBuf);
}
//MessageBox(NULL, rec, "", NULL);
closesocket(sockClient);
WSACleanup();
return rec;
}
最后的接收函数有点问题更新一下:
//判断是否接收完整
while (num = recv(sockClient, (char*)recvBuf, sizeof(recvBuf)-1, 0)>0)
{
recvBuf[sizeof(recvBuf)-1] = '\0';
sprintf(rec, "%s%s", rec, recvBuf);
memset(recvBuf, 0, sizeof(recvBuf));
recvBuf[0] = '\0';
}