C/C++创建Socket实现双工通信

实现简单的Socket通信

服务端代码(Server)

#include <stdio.h>  
#include <winsock2.h>  
#pragma comment(lib,"ws2_32.lib")
#define PORT 9999 

int main()
{
WSADATA WSAData;
SOCKET sock, msgsock;
struct sockaddr_in ServerAddr;

</span><span style="color: #0000ff;">if</span> (WSAStartup(MAKEWORD(<span style="color: #800080;">2</span>, <span style="color: #800080;">0</span>), &amp;WSAData) !=<span style="color: #000000;"> SOCKET_ERROR)
{
    ServerAddr.sin_family </span>=<span style="color: #000000;"> AF_INET;
    ServerAddr.sin_port </span>=<span style="color: #000000;"> htons(PORT);
    ServerAddr.sin_addr.s_addr </span>=<span style="color: #000000;"> INADDR_ANY;

    sock </span>= socket(AF_INET, SOCK_STREAM, <span style="color: #800080;">0</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">int</span> BindRet = bind(sock, (LPSOCKADDR)&amp;ServerAddr, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(ServerAddr));
    </span><span style="color: #0000ff;">int</span> LinsRet = listen(sock, <span style="color: #800080;">10</span><span style="color: #000000;">);
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">------------------------------------------------------------------------------------------\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">绑定状态: %d\t 侦听状态: %d\t 绑定端口: %d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, BindRet, LinsRet, ntohs(ServerAddr.sin_port));
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">------------------------------------------------------------------------------------------\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}

</span><span style="color: #0000ff;">while</span> (<span style="color: #800080;">1</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">char</span> buf[<span style="color: #800080;">1024</span><span style="color: #000000;">];
    msgsock </span>= accept(sock, (LPSOCKADDR)<span style="color: #800080;">0</span>, (<span style="color: #0000ff;">int</span> *)<span style="color: #800080;">0</span><span style="color: #000000;">);
    memset(buf, </span><span style="color: #800080;">0</span>, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buf));
    recv(msgsock, buf, </span><span style="color: #800080;">1024</span>, <span style="color: #800080;">0</span><span style="color: #000000;">);
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">客户IP: %s\t 端口:%d\t 数据:%s\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port),buf);
    </span><span style="color: #0000ff;">if</span> (!strcmp(buf, <span style="color: #800000;">"</span><span style="color: #800000;">Success</span><span style="color: #800000;">"</span><span style="color: #000000;">))
    {
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">客户端已就绪...\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    }
    closesocket(msgsock);
}
closesocket(sock);
WSACleanup();
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

View Code

客户端代码(Client)

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define IP "127.0.0.1"
#define PORT 9999

//#ifdef _MSC_VER
//#pragma comment( linker, “/subsystem:"windows" /entry:"mainCRTStartup"“ )
//#endif

int main()
{
while (1)
{
WSADATA WSAData;
SOCKET sock;
struct sockaddr_in ClientAddr;

    </span><span style="color: #0000ff;">if</span> (WSAStartup(MAKEWORD(<span style="color: #800080;">2</span>, <span style="color: #800080;">0</span>), &amp;WSAData) !=<span style="color: #000000;"> SOCKET_ERROR)
    {
        ClientAddr.sin_family </span>= AF_INET;                <span style="color: #008000;">//</span><span style="color: #008000;">指Internet域</span>
        ClientAddr.sin_port = htons(PORT);            <span style="color: #008000;">//</span><span style="color: #008000;">指定服务端所预留的端口</span>
        ClientAddr.sin_addr.s_addr = inet_addr(IP);    <span style="color: #008000;">//</span><span style="color: #008000;">指定服务端所绑定的IP地址</span>
sock = socket(AF_INET, SOCK_STREAM, 0); int Ret = connect(sock, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr)); if (Ret == 0) { char Status[] = "Success"; int ServerRet = send(sock, Status, sizeof(Status), 0); if (ServerRet != 0) { printf("发送给服务器Success状态成功..\n"); } } } closesocket(sock); WSACleanup(); Sleep(5000); } return 0; }
View Code

 

实现Socket单工通信案例

服务端代码(Server)

#include <stdio.h>  
#include <winsock2.h>  
#pragma comment(lib,"ws2_32.lib")    //把ws2_32.lib加到Link页的连接库  
#define PORT 15001                    //通信的端口(指服务器端)
#define ERROR 0  
#define BUFFER_SIZE 1024            //注意:此Server端数据接收缓冲区 >= Client端数据发送缓冲区 ,否则造成缓冲区溢出
/*
    服务端原理:
        1、服务器进程创建套接字
        2、将本地地址绑定到所创建的套接字上,以三元组{<通信协议>,<IP地址>,<端口号>}在网络上标识该套接字
        3、将套接字置入监听模式,并准备接受连接请求
*/
int main()  
{  
    WSADATA WSAData;  
    if(WSAStartup(MAKEWORD(2,0),&WSAData)==SOCKET_ERROR)  //启动winsock ,WSAStartup()函数对Winsock DLL进行初始化
    {  
        printf("Socket initialize fail!\n");  
        exit(1);  
    }  
    SOCKET sock;                                        //服务进程创建套接字句柄(用于监听)
    if((sock=socket(AF_INET,SOCK_STREAM,0))==ERROR)        //调用socket()函数创建一个流套接字,参数(网络地址类型,套接字类型,网络协议)
    { 
        printf("Socket create!\n");  
        WSACleanup();  
        exit(1);  
    }  
    struct sockaddr_in ServerAddr;            //sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构
    ServerAddr.sin_family=AF_INET;            //sin_family字段必须设为AF_INET,表示该Socket处于Internet域
    ServerAddr.sin_port=htons(PORT);        //sin_port字段用于指定服务端口,注意避免冲突
    ServerAddr.sin_addr.s_addr=INADDR_ANY;  //sin_addr字段用于把一个IP地址保存为一个4字节的数,无符号长整型,根据不同用法还可表示本地或远程IP地址
    if(bind(sock,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)  //调用bind()函数将本地地址绑定到所创建的套接字上,以在网络上标识该套接字
    {   
        printf("Bind fail!\n");  
        closesocket(sock);  
        WSACleanup();  
        exit(1);  
    }  
    printf("Server Socket Port:%d\n",ntohs(ServerAddr.sin_port));  
    if(listen(sock,10)==SOCKET_ERROR)        //调用listen()函数将套接字置入监听模式并准备接受连接请求,参数(已捆绑未连接的套接字描述字,正在等待连接的最大队列长度)
    { 
        printf("Listen fail!\n");  
        closesocket(sock);  
        WSACleanup();  
        exit(1);  
    }  

SOCKET msgsock;            </span><span style="color: #008000;">//</span><span style="color: #008000;">创建一个新的套接字(用于接收accept函数的返回值,即表示已经接受的那个客户端的连接,进而接收Client发来的数据)</span>
<span style="color: #0000ff;">char</span> buf[BUFFER_SIZE];  <span style="color: #008000;">//</span><span style="color: #008000;">数据接收缓冲区</span>
<span style="color: #0000ff;">while</span>(<span style="color: #800080;">1</span><span style="color: #000000;">)  
{  
    </span><span style="color: #0000ff;">if</span>((msgsock=accept(sock,(LPSOCKADDR)<span style="color: #800080;">0</span>,(<span style="color: #0000ff;">int</span> *)<span style="color: #800080;">0</span>))==INVALID_SOCKET)  <span style="color: #008000;">//</span><span style="color: #008000;">进入监听状态后,调用accept()函数接收客户端的连接请求,并把连接传给msgsock套接字,原sock套接字继续监听其他客户机连接请求</span>

{
printf(
Accept fail!\n);
continue;
}
memset(buf,
0,sizeof(buf)); //初始化数据接收缓冲区
recv(msgsock,buf,BUFFER_SIZE,0); //接收客户端发送过来的数据
if(buf[0]==e && buf[1]==x && buf[2]==i && buf[3]==t) //“exit”命令,退出程序
{
printf(
The End.\n);
break;
}
printf(
C:\Socket\Server>%s,buf);
closesocket(msgsock);
}

closesocket(sock); </span><span style="color: #008000;">//</span><span style="color: #008000;">关闭套接字  </span>
WSACleanup();       <span style="color: #008000;">//</span><span style="color: #008000;">终止对Winsock DLL的使用,并释放资源</span>
<span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

View Code

客户端代码(Client)

#include <winsock2.h>  
#include <stdio.h>  
#pragma comment(lib,"ws2_32.lib")    //把ws2_32.lib加到Link页的连接库  
//#define IP "172.18.68.243"            //在两台计算机上测试,IP为Server端的IP地址  
#define IP "127.0.0.1"                //在一台计算机上测试,IP为本地回送地址
#define PORT 15001                    //注意:客户端设置通信的端口 = 服务端的端口
#define BUFFER_SIZE 1024            //数据发送缓冲区大小

int main()
{
char buf[BUFFER_SIZE]; //buf数组存放客户端发送的消息
int inputLen; //用于输入字符自增变量
while(1)
{
printf(
C:\Socket\Client>);
inputLen
=0;
memset(buf,
0,sizeof(buf));
while((buf[inputLen++]=getchar())!=\n) //输入以回车键为结束标识
{
;
}
if(buf[0]==e && buf[1]==x && buf[2]==i && buf[3]==t)
{
printf(
The End.\n);
break;
}

    WSADATA WSAData;  
    </span><span style="color: #0000ff;">if</span>(WSAStartup(MAKEWORD(<span style="color: #800080;">2</span>,<span style="color: #800080;">0</span>),&amp;WSAData)==SOCKET_ERROR)  <span style="color: #008000;">//</span><span style="color: #008000;">WSAStartup()函数对Winsock DLL进行初始化</span>

{
printf(
Socket initialize fail!\n);
continue;
}
SOCKET sock;
//客户端进程创建套接字
if((sock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR) //创建流套接字(与服务端保持一致)
{
printf(
Socket create fail!\n);
WSACleanup();
continue;
}

    </span><span style="color: #0000ff;">struct</span> sockaddr_in ClientAddr;                <span style="color: #008000;">//</span><span style="color: #008000;">sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构</span>
    ClientAddr.sin_family=AF_INET;                <span style="color: #008000;">//</span><span style="color: #008000;">指Internet域</span>
    ClientAddr.sin_port=htons(PORT);            <span style="color: #008000;">//</span><span style="color: #008000;">指定服务端所预留的端口</span>
    ClientAddr.sin_addr.s_addr=inet_addr(IP);    <span style="color: #008000;">//</span><span style="color: #008000;">指定服务端所绑定的IP地址</span>
    <span style="color: #0000ff;">if</span>(connect(sock,(LPSOCKADDR)&amp;ClientAddr,<span style="color: #0000ff;">sizeof</span>(ClientAddr))==SOCKET_ERROR)  <span style="color: #008000;">//</span><span style="color: #008000;">调用connect()函数,向服务器进程发出连接请求  </span>

{
printf(
Connect fail!\n);
closesocket(sock);
WSACleanup();
continue;
}
send(sock,buf,BUFFER_SIZE,
0); //向服务器发送数据
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源,以备下一次使用
}
return 0;
}

View Code

 

实现Socket双工通信案例

服务端代码(Server)

#include <stdio.h>
#include <Winsock2.h> //Socket的函数调用 
#include <windows.h>

#define BUF_SIZE 6400 // 缓冲区大小

#pragma comment (lib, “ws2_32”) // 使用WINSOCK2.H时,则需要库文件WS2_32.LIB

DWORD WINAPI Rcv(LPVOID lpParam)
{
SOCKET sClient = (SOCKET)lpParam;
int retVal;
char bufRecv[BUF_SIZE];
memset(bufRecv,
0, sizeof(bufRecv));
while (1)
{
retVal
= recv(sClient, bufRecv, BUF_SIZE, 0);
if (retVal == SOCKET_ERROR) {
printf(
recive faild!\n);
break;
}
else {
printf(
收到客户端消息:%s\n, bufRecv);
}
}
return 0;
}

DWORD WINAPI Snd(LPVOID lpParam)
{
SOCKET sClient = (SOCKET)lpParam;
int retVal;
char bufSend[BUF_SIZE];
memset(bufSend,
0, sizeof(bufSend));
while (1)
{
gets(bufSend);
retVal
= send(sClient, bufSend, strlen(bufSend) + sizeof(char), 0);
if (retVal == SOCKET_ERROR) {
printf(
send faild!\n);
break;
}
}
return 0;
}

int main(int argc, char* argv[])
{
// 初始化套接字动态库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf(
winsock load faild!\n);
return 1;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">  创建服务段套接字</span>
SOCKET sServer =<span style="color: #000000;"> socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
</span><span style="color: #0000ff;">if</span> (sServer ==<span style="color: #000000;"> INVALID_SOCKET) {
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">socket faild!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">  服务端地址</span>

sockaddr_in addrServ;

addrServ.sin_family </span>=<span style="color: #000000;"> AF_INET;
addrServ.sin_port </span>= htons(<span style="color: #800080;">9999</span><span style="color: #000000;">);
addrServ.sin_addr.s_addr </span>=<span style="color: #000000;"> htonl(INADDR_ANY);

</span><span style="color: #008000;">//</span><span style="color: #008000;">  绑定套接字</span>
<span style="color: #0000ff;">if</span> (bind(sServer, (<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">struct</span> sockaddr*)&amp;addrServ, <span style="color: #0000ff;">sizeof</span>(addrServ)) ==<span style="color: #000000;"> SOCKET_ERROR) {
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">bind faild!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    closesocket(sServer);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}

printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Server is On IP:[%s],port:[%d]\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, inet_ntoa(addrServ.sin_addr), ntohs(addrServ.sin_port));

</span><span style="color: #008000;">//</span><span style="color: #008000;">  监听套接字  数字表示最多能监听客户个数</span>
<span style="color: #0000ff;">if</span> (listen(sServer, <span style="color: #800080;">5</span>) ==<span style="color: #000000;"> SOCKET_ERROR) {
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">listen faild!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    closesocket(sServer);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}

SOCKET sClient; </span><span style="color: #008000;">//</span><span style="color: #008000;">  客户端套接字</span>
sockaddr_in addrClient; int addrClientLen = sizeof(addrClient);
sClient </span>= accept(sServer, (sockaddr FAR*)&amp;addrClient, &amp;<span style="color: #000000;">addrClientLen);
</span><span style="color: #0000ff;">if</span> (sClient ==<span style="color: #000000;"> INVALID_SOCKET) {
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">accept faild!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    closesocket(sServer);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}
printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">accepted client IP:[%s],port:[%d]\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port));

HANDLE hThread1, hThread2;
DWORD dwThreadId1, dwThreadId2;

hThread1 </span>= ::CreateThread(NULL, NULL, Snd, (LPVOID*)&amp;sClient, <span style="color: #800080;">0</span>, &amp;<span style="color: #000000;">dwThreadId1);
hThread2 </span>= ::CreateThread(NULL, NULL, Rcv, (LPVOID*)&amp;sClient, <span style="color: #800080;">0</span>, &amp;<span style="color: #000000;">dwThreadId2);

::WaitForSingleObject(hThread1, INFINITE);
::WaitForSingleObject(hThread2, INFINITE);
::CloseHandle(hThread1);
::CloseHandle(hThread2);

closesocket(sClient);
WSACleanup(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 资源释放</span>

<span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

View Code

客户端代码(Client)

#include <stdio.h>
#include <Winsock2.h> //Socket的函数调用 
#include <windows.h>

#define BUF_SIZE 6400

#pragma comment (lib, “ws2_32”) // 使用WINSOCK2.H时,则需要库文件WS2_32.LIB

DWORD WINAPI Rcv(LPVOID lpParam)
{
SOCKET sHost = (SOCKET)lpParam;
int retVal;
char bufRecv[BUF_SIZE];
memset(bufRecv,
0, sizeof(bufRecv));
while (1)
{
retVal
= recv(sHost, bufRecv, BUF_SIZE, 0);
if (retVal == SOCKET_ERROR) {
printf(
recive faild!\n);
break;
}
else {
printf(
收到服务器消息:%s\n, bufRecv);
}
}
return 0;
}

DWORD WINAPI Snd(LPVOID lpParam)
{
SOCKET sHost = (SOCKET)lpParam;
int retVal;
char bufSend[BUF_SIZE];
memset(bufSend,
0, sizeof(bufSend));
while (1)
{
gets(bufSend);
retVal
= send(sHost, bufSend, strlen(bufSend) + sizeof(char), 0);
if (retVal == SOCKET_ERROR) {
printf(
send faild!\n);
break;
}
}
return 0;
}

int main(int argc, char* argv[])
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf(
Winsock load faild!\n);
return 1;
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">  服务器套接字</span>
SOCKET sHost =<span style="color: #000000;"> socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
</span><span style="color: #0000ff;">if</span> (sHost ==<span style="color: #000000;"> INVALID_SOCKET) {
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">socket faild!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}

SOCKADDR_IN servAddr;
servAddr.sin_family </span>=<span style="color: #000000;"> AF_INET;
</span><span style="color: #008000;">//</span><span style="color: #008000;">  注意   当把客户端程序发到别人的电脑时 此处IP需改为服务器所在电脑的IP</span>
servAddr.sin_addr.S_un.S_addr = inet_addr(<span style="color: #800000;">"</span><span style="color: #800000;">127.0.0.1</span><span style="color: #800000;">"</span><span style="color: #000000;">);
servAddr.sin_port </span>= htons(<span style="color: #800080;">9999</span><span style="color: #000000;">);

</span><span style="color: #008000;">//</span><span style="color: #008000;">  连接服务器</span>
<span style="color: #0000ff;">if</span> (connect(sHost, (LPSOCKADDR)&amp;servAddr, <span style="color: #0000ff;">sizeof</span>(servAddr)) ==<span style="color: #000000;"> SOCKET_ERROR) {
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">connect faild!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    closesocket(sHost);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}
printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">连接到服务器 IP:[%s],port:[%d]\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, inet_ntoa(servAddr.sin_addr), ntohs(servAddr.sin_port));

HANDLE hThread1, hThread2;
DWORD dwThreadId1, dwThreadId2;

hThread1 </span>= ::CreateThread(NULL, NULL, Snd, (LPVOID)&amp;sHost, <span style="color: #800080;">0</span>, &amp;<span style="color: #000000;">dwThreadId1);
hThread2 </span>= ::CreateThread(NULL, NULL, Rcv, (LPVOID)&amp;sHost, <span style="color: #800080;">0</span>, &amp;<span style="color: #000000;">dwThreadId2);

::WaitForSingleObject(hThread1, INFINITE);
::WaitForSingleObject(hThread2, INFINITE);
::CloseHandle(hThread1);
::CloseHandle(hThread2);


closesocket(sHost);
WSACleanup();
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

View Code

 

实现文件传输

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <WinSock2.h> 

#define PORT 8087
#define SERVER_IP “127.0.0.1”
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, “WS2_32”)

int main()
{
// 声明并初始化一个服务端(本地)的地址结构
sockaddr_in server_addr;
server_addr.sin_family
= AF_INET;
server_addr.sin_addr.S_un.S_addr
= INADDR_ANY;
server_addr.sin_port
= htons(PORT);

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 初始化socket dll </span>

WSADATA wsaData;
WORD socketVersion
= MAKEWORD(2, 0);
if (WSAStartup(socketVersion, &wsaData) != 0)
{
printf(
Init socket dll error!);
exit(
1);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建socket </span>
SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, <span style="color: #800080;">0</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (SOCKET_ERROR ==<span style="color: #000000;"> m_Socket)
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Create Socket Error!</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">绑定socket和服务端(本地)地址 </span>
<span style="color: #0000ff;">if</span> (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&amp;server_addr, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(server_addr)))
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Server Bind Failed: %d</span><span style="color: #800000;">"</span><span style="color: #000000;">, WSAGetLastError());
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">监听 </span>
<span style="color: #0000ff;">if</span> (SOCKET_ERROR == listen(m_Socket, <span style="color: #800080;">10</span><span style="color: #000000;">))
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Server Listen Failed: %d</span><span style="color: #800000;">"</span><span style="color: #000000;">, WSAGetLastError());
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}


</span><span style="color: #0000ff;">while</span> (<span style="color: #800080;">1</span><span style="color: #000000;">)
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Listening To Client...\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);

    sockaddr_in client_addr;
    </span><span style="color: #0000ff;">int</span> client_addr_len = <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(client_addr);

    SOCKET m_New_Socket </span>= accept(m_Socket, (sockaddr *)&amp;client_addr, &amp;<span style="color: #000000;">client_addr_len);
    </span><span style="color: #0000ff;">if</span> (SOCKET_ERROR ==<span style="color: #000000;"> m_New_Socket)
    {
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Server Accept Failed: %d</span><span style="color: #800000;">"</span><span style="color: #000000;">, WSAGetLastError());
        </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
    }

    </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> buffer[BUFFER_SIZE];
    memset(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, BUFFER_SIZE);
    </span><span style="color: #0000ff;">if</span> (recv(m_New_Socket, buffer, BUFFER_SIZE, <span style="color: #800080;">0</span>) &lt; <span style="color: #800080;">0</span><span style="color: #000000;">)
    {
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Server Receive Data Failed!</span><span style="color: #800000;">"</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
    }

    </span><span style="color: #0000ff;">char</span> file_name[FILE_NAME_MAX_SIZE + <span style="color: #800080;">1</span><span style="color: #000000;">];
    memset(file_name, </span><span style="color: #800080;">0</span>, FILE_NAME_MAX_SIZE + <span style="color: #800080;">1</span><span style="color: #000000;">);
    strncpy(file_name, buffer, strlen(buffer)</span>&gt;FILE_NAME_MAX_SIZE ?<span style="color: #000000;"> FILE_NAME_MAX_SIZE : strlen(buffer));
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%s\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);

    FILE </span>* fp = fopen(file_name, <span style="color: #800000;">"</span><span style="color: #800000;">rb</span><span style="color: #800000;">"</span>); <span style="color: #008000;">//</span><span style="color: #008000;">windows下是"rb",表示打开一个只读的二进制文件 </span>
    <span style="color: #0000ff;">if</span> (NULL ==<span style="color: #000000;"> fp)
    {
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">File: %s Not Found\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);
    }
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
    {
        memset(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, BUFFER_SIZE);
        </span><span style="color: #0000ff;">int</span> length = <span style="color: #800080;">0</span><span style="color: #000000;">;

        </span><span style="color: #0000ff;">while</span> ((length = fread(buffer, <span style="color: #0000ff;">sizeof</span>(<span style="color: #0000ff;">char</span>), BUFFER_SIZE, fp)) &gt; <span style="color: #800080;">0</span><span style="color: #000000;">)
        {
            </span><span style="color: #0000ff;">if</span> (send(m_New_Socket, buffer, length, <span style="color: #800080;">0</span>) &lt; <span style="color: #800080;">0</span><span style="color: #000000;">)
            {
                printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Send File: %s Failed\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);
                </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
            }
            memset(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, BUFFER_SIZE);
        }

        fclose(fp);
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">File: %s Transfer Successful!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);
    }
    closesocket(m_New_Socket);
}

closesocket(m_Socket);
</span><span style="color: #008000;">//</span><span style="color: #008000;">释放winsock库 </span>

WSACleanup();
return 0;
}

View Code
/*************************************************************************
> File Name: Win_Client.c
> Author: SongLee
************************************************************************/

#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<WinSock2.h>

#define PORT 8087
#define SERVER_IP “127.0.0.1”
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, “WS2_32”)

int main()
{
// 初始化socket dll
WSADATA wsaData;
WORD socketVersion
= MAKEWORD(2, 0);
if (WSAStartup(socketVersion, &wsaData) != 0)
{
printf(
Init socket dll error!);
exit(
1);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">创建socket </span>
SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, <span style="color: #800080;">0</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (SOCKET_ERROR ==<span style="color: #000000;"> c_Socket)
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Create Socket Error!</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    system(</span><span style="color: #800000;">"</span><span style="color: #800000;">pause</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">指定服务端的地址 </span>

sockaddr_in server_addr;
server_addr.sin_family
= AF_INET;
server_addr.sin_addr.S_un.S_addr
= inet_addr(SERVER_IP);
server_addr.sin_port
= htons(PORT);

</span><span style="color: #0000ff;">if</span> (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&amp;server_addr, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(server_addr)))
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Can Not Connect To Server IP!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    system(</span><span style="color: #800000;">"</span><span style="color: #800000;">pause</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">输入文件名 </span>
<span style="color: #0000ff;">char</span> file_name[FILE_NAME_MAX_SIZE + <span style="color: #800080;">1</span><span style="color: #000000;">];
memset(file_name, </span><span style="color: #800080;">0</span>, FILE_NAME_MAX_SIZE + <span style="color: #800080;">1</span><span style="color: #000000;">);
printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Please Input File Name On Server: </span><span style="color: #800000;">"</span><span style="color: #000000;">);
scanf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%s</span><span style="color: #800000;">"</span>, &amp;<span style="color: #000000;">file_name);

</span><span style="color: #0000ff;">char</span><span style="color: #000000;"> buffer[BUFFER_SIZE];
memset(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)</span>&gt;BUFFER_SIZE ?<span style="color: #000000;"> BUFFER_SIZE : strlen(file_name));

</span><span style="color: #008000;">//</span><span style="color: #008000;">向服务器发送文件名 </span>
<span style="color: #0000ff;">if</span> (send(c_Socket, buffer, BUFFER_SIZE, <span style="color: #800080;">0</span>) &lt; <span style="color: #800080;">0</span><span style="color: #000000;">)
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Send File Name Failed\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    system(</span><span style="color: #800000;">"</span><span style="color: #800000;">pause</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}

</span><span style="color: #008000;">//</span><span style="color: #008000;">打开文件,准备写入 </span>
FILE * fp = fopen(file_name, <span style="color: #800000;">"</span><span style="color: #800000;">wb</span><span style="color: #800000;">"</span>); <span style="color: #008000;">//</span><span style="color: #008000;">windows下是"wb",表示打开一个只写的二进制文件 </span>
<span style="color: #0000ff;">if</span> (NULL ==<span style="color: #000000;"> fp)
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">File: %s Can Not Open To Write\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);
    system(</span><span style="color: #800000;">"</span><span style="color: #800000;">pause</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    exit(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
    memset(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, BUFFER_SIZE);
    </span><span style="color: #0000ff;">int</span> length = <span style="color: #800080;">0</span><span style="color: #000000;">;
    </span><span style="color: #0000ff;">while</span> ((length = recv(c_Socket, buffer, BUFFER_SIZE, <span style="color: #800080;">0</span>)) &gt; <span style="color: #800080;">0</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">if</span> (fwrite(buffer, <span style="color: #0000ff;">sizeof</span>(<span style="color: #0000ff;">char</span>), length, fp) &lt;<span style="color: #000000;"> length)
        {
            printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">File: %s Write Failed\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);
            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
        }
        memset(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, BUFFER_SIZE);
    }

    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">Receive File: %s From Server Successful!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, file_name);
}

fclose(fp);
closesocket(c_Socket);

</span><span style="color: #008000;">//</span><span style="color: #008000;">释放winsock库 </span>

WSACleanup();

system(</span><span style="color: #800000;">"</span><span style="color: #800000;">pause</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

View Code

 

使用select

#include<stdlib.h>
#include<WINSOCK2.H>
#include <windows.h> 
#include <process.h>  

#include<iostream>
#include
<string>
using namespace std;

#define BUF_SIZE 64
#pragma comment(lib,”WS2_32.lib”)

void recv(PVOID pt)
{
SOCKET sHost
= *((SOCKET *)pt);

</span><span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
{
    </span><span style="color: #0000ff;">char</span> buf[BUF_SIZE];<span style="color: #008000;">//</span><span style="color: #008000;">清空接收数据的缓冲区</span>
    memset(buf, <span style="color: #800080;">0</span><span style="color: #000000;">, BUF_SIZE);
    </span><span style="color: #0000ff;">int</span> retVal = recv(sHost, buf, <span style="color: #0000ff;">sizeof</span>(buf), <span style="color: #800080;">0</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">if</span> (SOCKET_ERROR ==<span style="color: #000000;"> retVal)
    {
        </span><span style="color: #0000ff;">int</span>  err =<span style="color: #000000;"> WSAGetLastError();
        </span><span style="color: #008000;">//</span><span style="color: #008000;">无法立即完成非阻塞Socket上的操作</span>
        <span style="color: #0000ff;">if</span> (err ==<span style="color: #000000;"> WSAEWOULDBLOCK)
        {
            Sleep(</span><span style="color: #800080;">1000</span><span style="color: #000000;">);
            printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">\nwaiting  reply!</span><span style="color: #800000;">"</span><span style="color: #000000;">);
            </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (err == WSAETIMEDOUT || err == WSAENETDOWN || err == WSAECONNRESET)<span style="color: #008000;">//</span><span style="color: #008000;">已建立连接</span>

{
printf(
\nrecv failed!);
closesocket(sHost);
WSACleanup();
return;
}

    }

    Sleep(</span><span style="color: #800080;">100</span><span style="color: #000000;">);

    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">\n%s</span><span style="color: #800000;">"</span><span style="color: #000000;">, buf);
    </span><span style="color: #008000;">//</span><span style="color: #008000;">break;</span>

}
}

int main()
{
WSADATA wsd;
SOCKET sHost;
SOCKADDR_IN servAddr;
//服务器地址
int retVal;//调用Socket函数的返回值
char buf[BUF_SIZE];
//初始化Socket环境
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf(
WSAStartup failed!\n);
return -1;
}
sHost
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//设置服务器Socket地址
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr
= inet_addr(127.0.0.1);
//在实际应用中,建议将服务器的IP地址和端口号保存在配置文件中
servAddr.sin_port = htons(6000);
//计算地址的长度
int sServerAddlen = sizeof(servAddr);

</span><span style="color: #008000;">//</span><span style="color: #008000;">调用ioctlsocket()将其设置为非阻塞模式</span>
<span style="color: #0000ff;">int</span> iMode = <span style="color: #800080;">1</span><span style="color: #000000;">;
retVal </span>= ioctlsocket(sHost, FIONBIO, (u_long FAR*)&amp;<span style="color: #000000;">iMode);


</span><span style="color: #0000ff;">if</span> (retVal ==<span style="color: #000000;"> SOCKET_ERROR)
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">ioctlsocket failed!</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    WSACleanup();
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}


</span><span style="color: #008000;">//</span><span style="color: #008000;">循环等待</span>
<span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;">连接到服务器</span>
    retVal = connect(sHost, (LPSOCKADDR)&amp;servAddr, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(servAddr));
    </span><span style="color: #0000ff;">if</span> (SOCKET_ERROR ==<span style="color: #000000;"> retVal)
    {
        </span><span style="color: #0000ff;">int</span> err =<span style="color: #000000;"> WSAGetLastError();
        </span><span style="color: #008000;">//</span><span style="color: #008000;">无法立即完成非阻塞Socket上的操作</span>
        <span style="color: #0000ff;">if</span> (err == WSAEWOULDBLOCK || err ==<span style="color: #000000;"> WSAEINVAL)
        {
            Sleep(</span><span style="color: #800080;">1</span><span style="color: #000000;">);
            printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">check  connect!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
            </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (err == WSAEISCONN)<span style="color: #008000;">//</span><span style="color: #008000;">已建立连接</span>

{
break;
}
else
{
printf(
connection failed!\n);
closesocket(sHost);
WSACleanup();
return -1;
}
}
}

unsigned </span><span style="color: #0000ff;">long</span>     threadId = _beginthread(recv, <span style="color: #800080;">0</span>, &amp;sHost);<span style="color: #008000;">//</span><span style="color: #008000;">启动一个线程接收数据的线程   </span>



<span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;">向服务器发送字符串,并显示反馈信息</span>
    printf(<span style="color: #800000;">"</span><span style="color: #800000;">input a string to send:\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> str;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">接收输入的数据</span>
    std::cin &gt;&gt;<span style="color: #000000;"> str;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">将用户输入的数据复制到buf中</span>

ZeroMemory(buf, BUF_SIZE);
strcpy(buf, str.c_str());
if (strcmp(buf, quit) == 0)
{
printf(
quit!\n);
break;
}

    </span><span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
    {
        retVal </span>= send(sHost, buf, strlen(buf), <span style="color: #800080;">0</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span> (SOCKET_ERROR ==<span style="color: #000000;"> retVal)
        {
            </span><span style="color: #0000ff;">int</span> err =<span style="color: #000000;"> WSAGetLastError();
            </span><span style="color: #0000ff;">if</span> (err ==<span style="color: #000000;"> WSAEWOULDBLOCK)
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;">无法立即完成非阻塞Socket上的操作</span>
                Sleep(<span style="color: #800080;">5</span><span style="color: #000000;">);
                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;
            }

            </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
            {
                printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">send failed!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
                closesocket(sHost);
                WSACleanup();
                </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
            }
        }
        </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
    }


}

</span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;

}

View Code
#include <WinSock2.h>  
#include <Windows.h>  
#include <MSWSock.h>  
#include <stdio.h>  
#include <map>  
using namespace std;


#pragma comment(lib,”Ws2_32.lib”)
#pragma comment(lib,”Mswsock.lib”)

int main()
{
WSAData wsaData;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf(
初始化失败!%d\n, WSAGetLastError());
Sleep(
5000);
return -1;
}

USHORT nport </span>= <span style="color: #800080;">6000</span><span style="color: #000000;">;
SOCKET sListen </span>=<span style="color: #000000;"> socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

u_long ul </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
ioctlsocket(sListen, FIONBIO, </span>&amp;<span style="color: #000000;">ul);

sockaddr_in sin;
sin.sin_family </span>=<span style="color: #000000;"> AF_INET;
sin.sin_port </span>=<span style="color: #000000;"> htons(nport);
sin.sin_addr.S_un.S_addr </span>=<span style="color: #000000;"> ADDR_ANY;


</span><span style="color: #0000ff;">if</span> (SOCKET_ERROR == bind(sListen, (sockaddr*)&amp;sin, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(sin)))
{
    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">bind failed!%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, WSAGetLastError());
    Sleep(</span><span style="color: #800080;">5000</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">return</span> -<span style="color: #800080;">1</span><span style="color: #000000;">;
}


listen(sListen, </span><span style="color: #800080;">5</span><span style="color: #000000;">);


</span><span style="color: #008000;">//</span><span style="color: #008000;">1)初始化一个套接字集合fdSocket,并将监听套接字放入  </span>

fd_set socketSet;
FD_ZERO(
&socketSet);
FD_SET(sListen,
&socketSet);

TIMEVAL time </span>= { <span style="color: #800080;">1</span>, <span style="color: #800080;">0</span><span style="color: #000000;"> };
</span><span style="color: #0000ff;">char</span> buf[<span style="color: #800080;">4096</span><span style="color: #000000;">];


fd_set    readSet;
FD_ZERO(</span>&amp;<span style="color: #000000;">readSet);

fd_set    writeSet;
FD_ZERO(</span>&amp;<span style="color: #000000;">readSet);


</span><span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;">2)将fdSocket的一个拷贝fdRead传给select函数  </span>
    readSet =<span style="color: #000000;"> socketSet;
    writeSet </span>=<span style="color: #000000;"> socketSet;

    </span><span style="color: #008000;">//</span><span style="color: #008000;">同时检查套接字的可读可写性。</span>
    <span style="color: #0000ff;">int</span>   nRetAll = <span style="color: #0000ff;">select</span>(<span style="color: #800080;">0</span>, &amp;readSet, &amp;writeSet, NULL, NULL<span style="color: #008000;">/*</span><span style="color: #008000;">&amp;time</span><span style="color: #008000;">*/</span>);<span style="color: #008000;">//</span><span style="color: #008000;">若不设置超时则select为阻塞  </span>
    <span style="color: #0000ff;">if</span> (nRetAll &gt;<span style="color: #800080;">0</span>)   <span style="color: #008000;">//</span><span style="color: #008000;">-1</span>

{
//是否存在客户端的连接请求。
if (FD_ISSET(sListen, &readSet))//在readset中会返回已经调用过listen的套接字。
{

            </span><span style="color: #0000ff;">if</span> (socketSet.fd_count &lt;<span style="color: #000000;"> FD_SETSIZE)
            {
                sockaddr_in addrRemote;
                </span><span style="color: #0000ff;">int</span> nAddrLen = <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(addrRemote);
                SOCKET sClient </span>= accept(sListen, (sockaddr*)&amp;addrRemote, &amp;<span style="color: #000000;">nAddrLen);
                </span><span style="color: #0000ff;">if</span> (sClient !=<span style="color: #000000;"> INVALID_SOCKET)
                {
                    FD_SET(sClient, </span>&amp;<span style="color: #000000;">socketSet);
                    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">\n接收到连接:(%s)</span><span style="color: #800000;">"</span><span style="color: #000000;">, inet_ntoa(addrRemote.sin_addr));
                }
            }
            </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
            {
                printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">连接数量已达上限!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;
            }
        }


        </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i&lt;socketSet.fd_count; i++<span style="color: #000000;">)
        {
            </span><span style="color: #0000ff;">if</span> (FD_ISSET(socketSet.fd_array[i], &amp;<span style="color: #000000;">readSet))
            {
                </span><span style="color: #008000;">//</span><span style="color: #008000;">调用recv,接收数据。 </span>
                <span style="color: #0000ff;">int</span> nRecv = recv(socketSet.fd_array[i], buf, <span style="color: #800080;">4096</span>, <span style="color: #800080;">0</span><span style="color: #000000;">);
                </span><span style="color: #0000ff;">if</span> (nRecv &gt; <span style="color: #800080;">0</span><span style="color: #000000;">)
                {
                    buf[nRecv] </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
                    printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">\nrecv  %d :  %s</span><span style="color: #800000;">"</span><span style="color: #000000;">, socketSet.fd_array[i], buf);
                }
            }

            </span><span style="color: #0000ff;">if</span> (FD_ISSET(socketSet.fd_array[i], &amp;<span style="color: #000000;">writeSet))
            {

                </span><span style="color: #008000;">//</span><span style="color: #008000;">调用send,发送数据。</span>
                <span style="color: #0000ff;">char</span> buf[] = <span style="color: #800000;">"</span><span style="color: #800000;">hello!</span><span style="color: #800000;">"</span><span style="color: #000000;">;
                </span><span style="color: #0000ff;">int</span> nRet = send(socketSet.fd_array[i], buf, strlen(buf) + <span style="color: #800080;">1</span>, <span style="color: #800080;">0</span><span style="color: #000000;">);
                </span><span style="color: #0000ff;">if</span> (nRet &lt;= <span style="color: #800080;">0</span><span style="color: #000000;">)
                {
                    </span><span style="color: #0000ff;">if</span> (GetLastError() ==<span style="color: #000000;"> WSAEWOULDBLOCK)
                    {
                        </span><span style="color: #008000;">//</span><span style="color: #008000;">do nothing  </span>

}
else
{
closesocket(socketSet.fd_array[i]);
FD_CLR(socketSet.fd_array[i],
&socketSet);
}
}
else
{
printf(
\nsend hello!);
}
}
}

    }
    </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (nRetAll == <span style="color: #800080;">0</span><span style="color: #000000;">)
    {
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">time out!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">);
    }
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
    {
        printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">select error!%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, WSAGetLastError());
        Sleep(</span><span style="color: #800080;">5000</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
    }

    Sleep(</span><span style="color: #800080;">1000</span><span style="color: #000000;">);

}
closesocket(sListen);
WSACleanup();

}

View Code

 

代码来源于网络,你可以随意转载,仅用于收藏!