C/C++创建Socket实现双工通信
实现简单的Socket通信
服务端代码(Server)

#include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") #define PORT 9999int 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>), &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)&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;">;
}
客户端代码(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"“ )
//#endifint main()
{
while (1)
{
WSADATA WSAData;
SOCKET sock;
struct sockaddr_in ClientAddr;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; }</span><span style="color: #0000ff;">if</span> (WSAStartup(MAKEWORD(<span style="color: #800080;">2</span>, <span style="color: #800080;">0</span>), &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>
实现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;">;
}
客户端代码(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>),&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)&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;
}
实现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;
sockaddr_in addrClient; int addrClientLen = sizeof(addrClient);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*)&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>
sClient </span>= accept(sServer, (sockaddr FAR*)&addrClient, &<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*)&sClient, <span style="color: #800080;">0</span>, &<span style="color: #000000;">dwThreadId1); hThread2 </span>= ::CreateThread(NULL, NULL, Rcv, (LPVOID*)&sClient, <span style="color: #800080;">0</span>, &<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;">;
}
客户端代码(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)&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)&sHost, <span style="color: #800080;">0</span>, &<span style="color: #000000;">dwThreadId1); hThread2 </span>= ::CreateThread(NULL, NULL, Rcv, (LPVOID)&sHost, <span style="color: #800080;">0</span>, &<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;">;
}
实现文件传输

#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)&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 *)&client_addr, &<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>) < <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>>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)) > <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>) < <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;
}

/************************************************************************* > 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)&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>, &<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>>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>) < <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>)) > <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) <<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;">;
}
使用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*)&<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)&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>, &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 >><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;">;
}

#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>&<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*)&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>&<span style="color: #000000;">readSet); fd_set writeSet; FD_ZERO(</span>&<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>, &readSet, &writeSet, NULL, NULL<span style="color: #008000;">/*</span><span style="color: #008000;">&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 ><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 <<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*)&addrRemote, &<span style="color: #000000;">nAddrLen); </span><span style="color: #0000ff;">if</span> (sClient !=<span style="color: #000000;"> INVALID_SOCKET) { FD_SET(sClient, </span>&<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<socketSet.fd_count; i++<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (FD_ISSET(socketSet.fd_array[i], &<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 > <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], &<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 <= <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();
}
代码来源于网络,你可以随意转载,仅用于收藏!