服务器端: void CCWebServerDlg::OnButStartserver() { // TODO: Add your control notification handler code here //initialize Winsock WSADATA wsaData; CString cs_err; int iRet=WSAStartup(MAKEWORD(1,1),&wsaData); if(iRet!=NO_ERROR) MessageBox("Error at WSAStartup()\n"); //create a socket SOCKET m_socket; m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(m_socket==INVALID_SOCKET) { cs_err.Format("Error at socket():%ld\n",WSAGetLastError()); MessageBox(cs_err); WSACleanup(); return ; } //bind a socket sockaddr_in service; service.sin_family=AF_INET; service.sin_addr.s_addr=htonl(INADDR_ANY);//自动获取本机IP地址 service.sin_port=htons(9999); if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR) { MessageBox("bind() failed.\n"); closesocket(m_socket); return ; } else MessageBox("bind OK.\n"); //listen on a socket if(listen(m_socket,20)==SOCKET_ERROR) MessageBox("Error listening on socket.\n"); else MessageBox("listening ok.\n"); //accept a connection SOCKET AcceptSocket; MessageBox("Waiting for a client to connect...\n"); while(1) { AcceptSocket=SOCKET_ERROR; while(AcceptSocket==SOCKET_ERROR) { AcceptSocket=accept(m_socket,NULL,NULL); /////////////////这里出现阻塞 } MessageBox("Client Connected.\n"); DWORD dwThreadId; HANDLE hThread; hThread=CreateThread(NULL,NULL, AnswerThread, (LPVOID)AcceptSocket,0,&dwThreadId); if(hThread==NULL) { MessageBox("CreatThread AnswerThread() failed.\n"); } else { MessageBox("CreateThread OK.\n"); } } return ; } DWORD WINAPI CCWebServerDlg::AnswerThread(LPVOID lparam) ////注意: static DWORD WINAPI AnswerThread(LPVOID lparam); { SOCKET ClientSocket=(SOCKET)(LPVOID)lparam; int bytesRecv; char sendbuf[32]=""; char recvbuf[32]=""; CString cs_err; while(1) { bytesRecv=SOCKET_ERROR; for(int i=0;i<(int)strlen(recvbuf);i++) { recvbuf[i]='\0'; } while(bytesRecv==SOCKET_ERROR) { //Receiving Data bytesRecv=recv(ClientSocket,recvbuf,32,0); } //Write your processing code here send(ClientSocket,recvbuf,strlen(recvbuf),0); cs_err.Format("%s",recvbuf); AfxMessageBox(cs_err); } return 0; } 客户端: void CCWebClientDlg::LinkServer() { WORD wVersionRequested; WSADATA wsaData; int err; CString cs_err; wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1 //1.加载套接字库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { MessageBox("Error at WSAStartup()\n"); return; } //判断是否我们请求的winsocket版本,如果不是 //则调用WSACleanup终止winsocket的使用并返回 if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; }///...if //2.创建套接字 SOCKET sockClient = socket (AF_INET, SOCK_STREAM, 0); if(sockClient==INVALID_SOCKET) { cs_err.Format("Error at socket():%ld\n",WSAGetLastError()); MessageBox(cs_err); WSACleanup(); return ; } //3.连接服务器端,无须绑定 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr(ip); //设定服务器端IP地址,"127.0.0.1"是本地回路地址 //不管本地主机上有没有网卡,都可以用这个IP测试网络 addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(PORT); //端口号要与服务器端保持一致 // connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)); //连接服务器 if(connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)) < 0) { closesocket(sockClient); MessageBox("连接服务器失败。"); return ; } //4.先向服务器端发送数据,再接收服务器端发送的数据 /////////////////// //发送到服务端的数据 /* CString szBuf1; GetDlgItem(IDC_MSG)->GetWindowText(szBuf1);//显示在对话框中 char sendBuf[1024]; strncpy(sendBuf,szBuf1,sizeof(sendBuf)); //MessageBox("sssssssss1"); send(sockClient,(LPCTSTR)sendBuf,strlen(sendBuf)+1,0); //MessageBox("sssssssss2"); char recvBuf[1024]; int m; m=recv(sockClient,recvBuf,1024,0); CString szBuf; szBuf.Format("%s",recvBuf); GetDlgItem(IDC_RECEIVEMSG)->SetWindowText(szBuf); //MessageBox(sendBuf); */ //5.关闭套接字,释放资源,并且终止对套接字库的使用 closesocket(sockClient); WSACleanup(); //加头文件< winsock2.h.> //连接 ws2_32.lib } //////////////初始化网络设置 void CCWebClientDlg::InitSocket() { WORD wVersionRequested; WSADATA wsaData; char name[255]; // CString ip; int err; PHOSTENT hostinfo; wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1 //1.加载套接字库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } //判断是否我们请求的winsocket版本,如果不是 //则调用WSACleanup终止winsocket的使用并返回 if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; }///...if if ( err == 0 ) { if( gethostname ( name, sizeof(name)) == 0) { if((hostinfo = gethostbyname(name)) != NULL) { ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list); } } WSACleanup( ); } SetDlgItemText(IDC_IPADDRESS1,ip); //ip中是本机IP // SetDlgItemText(IDC_EDIT_PORT,name);//name里是本机名 CString cs_Port; int i_Port; i_Port =PORT; cs_Port.Format("%d",i_Port); SetDlgItemText(IDC_EDIT_PORT,cs_Port); } |
|
来自: herowuking > 《VC》