网上发现一些资源,想和同学共享,发现好像只能通过网络聊天工具传,心里好不舒服,萌生了一个点对点信息传播的想法,就开始了socket编程之路,借着清明节放假,写一下,还是小菜,看官多多见谅。。
另:用到书籍《windows网络编程》
这个是服务端
注释比较多,是tcp的,客户端和服务端差不多了,就没注释
#include #include #pragma comment (lib,"ws2_32.lib") using namespace std; int main(){ WSADATA wsd; SOCKET sServer; SOCKET sClient; int errcode; char buf[BUFSIZ]; //初始化套接字动态库 if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) { cout << "wsastrat failed" << endl; return -1; } //创建套接字 sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sServer == INVALID_SOCKET) { cout << "create socket failed" << endl; WSACleanup(); return -1; } //设置服务器socket地址 SOCKADDR_IN addrServ; //服务器地址 addrServ.sin_family = AF_INET; //地址簇,常用就是这个,不变 addrServ.sin_port = htons(10086); //监听端口 addrServ.sin_addr.S_un.S_addr = INADDR_ANY; //在任意本地端口监听 errcode = bind(sServer, (sockaddr*)&addrServ, sizeof(SOCKADDR_IN)); //绑定 socket,服务器地址,地址长度 if (SOCKET_ERROR == errcode) { cout << "bind failed" << endl; closesocket(sServer); WSACleanup(); return -1; } //监听 errcode = listen(sServer, 1); //监听服务器,等待队列 if (errcode == SOCKET_ERROR) { cout << "listen error" << endl; closesocket(sServer); WSACleanup(); return -1; } cout << "等待连接" << endl; //accept接受数据 sockaddr_in addrClient; int addrClientlen = sizeof(addrClient); sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen); if (INVALID_SOCKET==sClient) { cout << "accept failed" << endl; closesocket(sServer); WSACleanup(); return -1; } //循环接受客户端的数据,发出quit后退出 while (true) { ZeroMemory(buf,BUFSIZ); errcode = recv(sClient,buf,BUFSIZ,0);//接收客户端内容 if (SOCKET_ERROR==errcode) { cout << "recv failed" << endl; closesocket(sServer); closesocket(sClient); WSACleanup(); return -1; } if (strcmp(buf,"quit")==0) { errcode = send(sClient,"quit",strlen("quit"),0);//返回给客户端一个quit //服务端socket,数据,数据长度,0 break; } cout << "接收的数据:" << buf << endl; cout << "返回数据:" << endl; char msg[BUFSIZ]; cin >> msg; errcode = send(sClient,msg,strlen(msg),0);//返回服务端给客户端的数据 if (SOCKET_ERROR==errcode) { cout << "send failed" << endl; closesocket(sServer); closesocket(sClient); WSACleanup(); return -1; } } closesocket(sServer); closesocket(sClient); WSACleanup(); getchar(); } 这个是客户端 #include #include #pragma comment (lib,"ws2_32.lib") using namespace std; int main(){ WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; char buf[BUFSIZ]; int errcode; if (WSAStartup(MAKEWORD(2,2),&wsd)!=0) { cout << "wsastartup failed" << endl; return -1; } sHost = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (sHost == INVALID_SOCKET) { cout << "socket failed" << endl; WSACleanup(); return - 1; } servAddr.sin_family = AF_INET; servAddr.sin_addr.S_un.S_addr = inet_addr("localhost"); servAddr.sin_port = htons(10086); int sServerAddlen = sizeof(servAddr); errcode = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr)); if (SOCKET_ERROR==errcode) { cout << "connect error" << endl; closesocket(sHost); WSACleanup(); return -1; } while (true) { cout << "发送数据:" << endl; cin >> buf; errcode = send(sHost, buf, strlen(buf), 0); if (SOCKET_ERROR==errcode) { cout << "send failed" << endl; closesocket(sHost); WSACleanup(); return -1; } errcode = recv(sHost,buf,sizeof(buf)+1,0); cout << buf << endl; if (strcmp(buf, "quit") == 0) { cout << "quit" << endl; break; } } closesocket(sHost); WSACleanup(); getchar(); }