计算机网络实验二C++Socket 联系客服

发布时间 : 星期六 文章计算机网络实验二C++Socket更新完毕开始阅读672e96175f0e7cd184253645

实验二、基于socket的网络通信设计(C++语言实现)

内容:综合运用网络协议、编程语言、API和图形界面实现基于socket建立、监听、连接、发送数据和接收数据的网络通信程序。

基本要求:两人一组为单位,一个负责发送程序设计,一个负责接收程序设计,程序设计完成后,可以进行字符数据收发或文件传输。

服务端: //server.cpp

#include #include

#include #include #include

#pragma comment(lib, \ using namespace std;

void OutErr(string msg) { cout << \错误!发生在 \ }

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( \ break; } if(ret> 0) { if(FD_ISSET(c,&fdread))

{ ReciveBytes=recv(c,data,10,0); if(ReciveBytes==SOCKET_ERROR) { break; } cout << \收到字节数: \ < 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( \ return 1; } ser_addr.sin_addr.S_un.S_addr=inet_addr( \ 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( \

return 1; } if(bind(server,(SOCKADDR *)&ser_addr,sizeof(SOCKADDR))!=0) { OutErr(string( \ return 1; } if(listen(server,5)!=0) { OutErr(string( \ return 1; } while(1) { cliaddrLen=sizeof(SOCKADDR); client=accept(server,(SOCKADDR *)&cli_addr,&cliaddrLen); cout << \客户IP: \ << \,端口: \ ULONG ul=1; if(ioctlsocket(client,FIONBIO,&ul)==SOCKET_ERROR) { OutErr(string( \ 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 << \收到 \ < 0); } } }//while接收数据 if(Hnd==NULL) { CloseHandle(Hnd); closesocket(client); } } closesocket(server); WSACleanup(); return 0; }

客户端: //client.cpp

#include #include #include

#pragma comment(lib, \ using namespace std;

void OutErr(string msg) {