您的位置:首页 > 其它

Window API socket连接 client

2017-12-26 09:58 423 查看
本文socket client 与 server 同一端口通信

client端口的代码

#include <windows.h>

/***
* Function: SOCKET连接请求函数
* para:
* para:
* Return:
**/
bool SocketConnect(QString serverip, int sendport)
{
PosLog.log->info("enter SocketConnect");

WSADATA wsaData;
SOCKADDR_IN server_addr;

/* windows处理相关 */
WORD wVersion;
wVersion = MAKEWORD(2,2);
WSAStartup(wVersion,&wsaData);

/* 配置TCP/IP协议 */
server_addr.sin_addr.s_addr = inet_addr(serverip.toUtf8().data());
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(sendport);

/* 连接server */
if( (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
PosLog.log->info("Socket Connect INVALID");
return false;
}
if(connect(sock, (struct sockaddr *)&server_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
PosLog.log->info("Socket Connect ERROR");
return false;
}
else
{
PosLog.log->info("Socket Connect Success");
return true;
}
}

/***
* Function: SOCKET发送数据
* para:
* para:
* Return:
**/
bool SendSocketData(QString inPutMsg , QString& outPutMsg)
{
int res = 0;
char msg[1024*20] = {'\0'};

/* 发送数据 */
if(send(sock, inPutMsg.toUtf8().data(), inPutMsg.length(), 0) == SOCKET_ERROR)
{
return false;
}
else
{
/* 设置socket超时断开 */
int recvTimeout = 10 * 1000; //10s超时
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&recvTimeout ,sizeof(int));

/* 接收服务器返回数据 */
if((res = recv(sock, msg, 1024*20, 0)) == -1)
{
PosLog.log->info("fail to receive data from server");
}
else
{
outPutMsg = QString::fromUtf8(msg);
//PosLog.log->info("outPutMsg:"+outPutMsg);
memset(msg, '\0', sizeof(msg));
}
}
return true;
}

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