TCP

服务器

// server.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	if(0!=WSAStartup(MAKEWORD(2,2),&wsaData))
	{
		WSACleanup();
		return 1;
	}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
  WSACleanup( );
  return 1; 
}

	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);

	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	listen(sockSrv,5);

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);

	while(true)
	{
		SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		send(sockConn,"welcome",strlen("welcome")+1,0);
		char szGetBuf[100];
		recv(sockConn,szGetBuf,100,0);
		cout << szGetBuf << endl;
		closesocket(sockConn);
	}
	return 0;
}


客户端

// client.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	if(0!=WSAStartup(MAKEWORD(2,2),&wsaData))
	{
		WSACleanup();
		return 1;
	}
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
		WSACleanup( );
		return 1; 
	}
	
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
	
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);
	
	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	char szGetBuf[100];
	recv(sockClient,szGetBuf,100,0);
	cout << szGetBuf << endl;
	send(sockClient,"client",strlen("client")+1,0);
				
	closesocket(sockClient);
	
	return 0;
}


 设置发送和接收数据超时

	int timeout = 3*1000;
	BOOL ret = setsockopt(m_sockClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));
	if(SOCKET_ERROR == ret)
		return FALSE;

	timeout = 3*1000;
	ret = setsockopt(m_sockClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout));
	if(SOCKET_ERROR == ret)
		return FALSE;

设置连接超时

	//设置非阻塞方式连接
	unsigned long ul = 1;
	ret = ioctlsocket(m_sockClient, FIONBIO, (unsigned long*)&ul);
	if(ret==SOCKET_ERROR)return 0;

	sockaddr_in addr_in;
	addr_in.sin_family		= AF_INET;
	addr_in.sin_port		= htons(SERVER_PORT);
	addr_in.sin_addr.s_addr	= inet_addr(SERVER_IP);

	ret = connect(m_sockClient, (sockaddr *)&addr_in, sizeof(addr_in));
	struct timeval timeout ;
	fd_set r;
	FD_ZERO(&r);
	FD_SET(m_sockClient, &r);
	timeout.tv_sec = 3; //连接超时3秒
	timeout.tv_usec =0;
	ret = select(0, 0, &r, 0, &timeout);
	if ( ret <= 0 )
	{
		::closesocket(m_sockClient);
		return 0;
	}
	//一般非阻塞模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
	unsigned long ul1= 0 ;
	ret = ioctlsocket(m_sockClient, FIONBIO, (unsigned long*)&ul1);
	if(ret==SOCKET_ERROR){
		::closesocket (m_sockClient);
		return 0;
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值