Window API socket连接 client

本文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;
}






猜你喜欢

转载自blog.csdn.net/sea_snow/article/details/78899138
今日推荐