- 论坛徽章:
- 0
|
本帖最后由 keehoo 于 2011-12-20 12:33 编辑
//server.cpp 服务器端- #include <winsock2.h>
- #include <io.h>
- #include <windows.h>
- #include <iostream>
- #include <string>
- #pragma comment(lib, "WS2_32.lib ")
- using namespace std;
- void OutErr(string msg)
- {
- cout << "错误!发生在 " <<msg <<endl;
- }
- fd_set fdread;
- int ret;
- DWORD WINAPI ThreadProc(LPVOID lpParameter)
- {
- SOCKET c=(SOCKET)lpParameter;
- char data[80];
- UINT ReciveBytes=0;
- FD_ZERO(&fdread);
- FD_SET(c,&fdread);
- do
- {
- if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR)
- {
- OutErr(string( "select "));
- break;
- }
-
- if(ret> 0)
- {
- if(FD_ISSET(c,&fdread))
- {
- ReciveBytes=recv(c,data,10,0);
- if(ReciveBytes==SOCKET_ERROR)
- {
- break;
- }
- cout << "收到字节数: "
- <<ReciveBytes
- <<endl;
- data[ReciveBytes]= '\0 ';
- cout <<data <<endl;
- }
- }
- }while(ReciveBytes> 0);
- FD_CLR(c,&fdread);
- closesocket(c);
- return 0;
- }
- int main()
- {
- SOCKET server;
- SOCKET client;
- SOCKADDR_IN ser_addr,cli_addr;
- WSADATA wdata;
- int cliaddrLen=0;
- UINT port=4000;
- HANDLE Hnd;
- DWORD dwThreadID;
- if(WSAStartup(MAKEWORD(2,0),&wdata)!=0)
- {
- OutErr(string( "WSAStartup "));
- return 1;
- }
-
- ser_addr.sin_addr.S_un.S_addr=inet_addr( "0.0.0.0 ");
- ser_addr.sin_family=AF_INET;
- ser_addr.sin_port=htons(port);
-
- //if((server=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET)
- if((server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET)
- {
- OutErr(string( "WSASocket "));
- return 1;
- }
-
- if(bind(server,(SOCKADDR *)&ser_addr,sizeof(SOCKADDR))!=0)
- {
- OutErr(string( "bind "));
- return 1;
- }
-
- if(listen(server,5)!=0)
- {
- OutErr(string( "listen "));
- return 1;
- }
-
- while(1)
- {
- cliaddrLen=sizeof(SOCKADDR);
- client=accept(server,(SOCKADDR *)&cli_addr,&cliaddrLen);
- cout << "客户IP: " <<inet_ntoa(cli_addr.sin_addr)
- << ",端口: " <<ntohs(cli_addr.sin_port) <<endl;
-
- ULONG ul=1;
- if(ioctlsocket(client,FIONBIO,&ul)==SOCKET_ERROR)
- {
- OutErr(string( "ioctlsocket "));
- return 1;
- }
- FD_ZERO(&fdread);//清空集合
- FD_SET(client,&fdread);//将C加入到读取集合中
-
- //Hnd=CreateThread(NULL,0,ThreadProc,(LPVOID)client,0,&dwThreadID);
- //接收数据
- while(TRUE)
- {
- char data[11];
- int ReciveBytes;
- //这里阻断程序,知道缓冲区内有可读数据才返回
- if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR)
- {
- //套接字错误
- break;
- }
-
- if(ret> 0)
- {
- if(FD_ISSET(client,&fdread))//c中是否属于fdread集合
- {
- do//循环读取,每次接收10个字符,直到把缓冲区中全部取完
- {
- ReciveBytes=recv(client,data,10,0);
- if(ReciveBytes==SOCKET_ERROR)
- {
- //SOCKET错误
- break;
- }
- data[ReciveBytes]=0;//加上结束符
- cout << "收到 " <<ReciveBytes << "个字节:\n " <<data <<endl;
- }while(ReciveBytes> 0);
- }
- }
- }//while接收数据
-
- if(Hnd==NULL)
- {
- CloseHandle(Hnd);
- closesocket(client);
- }
- }
- closesocket(server);
- WSACleanup();
- return 0;
- }
复制代码 //client.cpp 客户端- #include <iostream>
- #include <winsock2.h>
- #include <string>
- #pragma comment(lib, "ws2_32.lib ")
- using namespace std;
- void OutErr(string msg)
- {
- cout << "错误发生: " <<msg <<endl;
- }
- int main()
- {
- SOCKET c;
- SOCKADDR_IN server_addr;
- WSADATA wsd;
- string msg;
- string remote_ip;
-
- cout << "输入对方IP地址: ";
- cin>> remote_ip;
- if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
- {
- OutErr(string( "WSAStartup "));
- return 1;
- }
-
- if((c=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET)
- {
- OutErr(string( "WSASocket "));
- return 1;
- }
- server_addr.sin_addr.S_un.S_addr=inet_addr(remote_ip.c_str());
- server_addr.sin_family=AF_INET;
- server_addr.sin_port=htons(4000);
-
- if(connect(c,(SOCKADDR *)&server_addr,sizeof(SOCKADDR_IN))!=0)
- {
- OutErr(string( "connect "));
- return 1;
- }
-
- do
- {
- int SentBytes;
- cin>> msg;
- if(msg== "exit ")break;
- if((SentBytes=send(c,msg.c_str(),msg.size(),0))==SOCKET_ERROR)
- {
- OutErr(string( "send "));
- break;
- }
- }while(1);
-
- closesocket(c);
- WSACleanup();
- return 0;
- }
复制代码 转载自:http://blog.sina.com.cn/s/blog_68b606350100yi5l.html |
|