服务器
// 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;
}