C++ SOCKET编程,如何监听多个端口,比如监听两个端口,关键代码该怎么写,求教求教,求代码!
#include
#include #include #pragma comment (lib, "Ws2_32.lib")unsigned int __stdcall listeningThread(void *param){ SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons((int)param); int ret = bind(sockSrv, (SOCKADDR*) &addrSrv, sizeof(SOCKADDR)); ret = listen(sockSrv, 5); SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); while (1) { SOCKET sockConn = accept(sockSrv, (SOCKADDR*) &addrClient, &len); char sendBuf [] = "Hello World !"; send(sockConn, sendBuf, strlen(sendBuf) + 1, 0); char recvBuf[50]; recv(sockConn, recvBuf, 50, 0); printf("%sn", recvBuf); closesocket(sockConn); } return 0;}void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return; } _beginthreadex(NULL, 0, listeningThread, (void *) 8120, 0, NULL); _beginthreadex(NULL, 0, listeningThread, (void *) 8121, 0, NULL); Sleep(INFINITE);}这个是windows平台的,创建两个线程,分别处理两个监听端口,端口通过参数传进去
考虑用select系统调用吧,具体例子请自己找找 #include int select(int maxfdp1, fd_set *restrict readfds,fd_set *restrict writefds, fd_set*restrict exceptfds, struct timeval *restrict tvptr);

C++ socket编程 和 MFC socket编程 有什么区别??
其实,不用说的太多。C++就是纯的利用socket进行网络通信编程。MFC就是基于图形界面进行网络通信编程。它们所调用的类库不一样。 补充一下答案:C++socket典型的调用方式是利用:异步套接字WSASocketTCPMFCsocket典型的调用方式是利用:CSocket 这两者有本质区别。

C++ SOCKET 服务器端向客户端发消息 被"0xcc"填充
C++通过socket编程实现服务端与客户端的通讯,代码如下(个人环境下测试正常,如果遇到运行send发送报错,请检查服务器端口是否被占用,调试的时候请先运行服务端程序在运行客服端,一定要加载库函数ws2_32.lib,发送字符时应该多加一个空字符作为结束字符): 服务器端程序:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697// Server.cpp : Defines the entry point for the console application.#include "winsock2.h"#pragma comment(lib, "ws2_32.lib")#include using namespace std;int main(int argc, char* argv[]){const int BUF_SIZE = 64;WSADATAwsd;//WSADATA变量SOCKETsServer;//服务器套接字SOCKETsClient;//客户端套接字SOCKADDR_INaddrServ;;//服务器地址charbuf[BUF_SIZE];//接收数据缓冲区charsendBuf[BUF_SIZE];//返回给客户端得数据intretVal;//返回值//初始化套结字动态库if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){cout << "WSAStartup failed!" << endl;return 1;}//创建套接字sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(INVALID_SOCKET == sServer){cout << "socket failed!" << endl;WSACleanup();//释放套接字资源;return-1;}//服务器套接字地址addrServ.sin_family = AF_INET;addrServ.sin_port = htons(4999);addrServ.sin_addr.s_addr = INADDR_ANY;//绑定套接字retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));if(SOCKET_ERROR == retVal){cout << "bind failed!" << endl;closesocket(sServer);//关闭套接字WSACleanup();//释放套接字资源;return -1;}//开始监听retVal = listen(sServer, 1);if(SOCKET_ERROR == retVal){cout << "listen failed!" << endl;closesocket(sServer);//关闭套接字WSACleanup();//释放套接字资源;return -1;}//接受客户端请求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;}while(true){//接收客户端数据ZeroMemory(buf, BUF_SIZE);retVal = recv(sClient, buf, BUF_SIZE, 0);if (SOCKET_ERROR == retVal){cout << "recv failed!" << endl;closesocket(sServer);//关闭套接字closesocket(sClient);//关闭套接字WSACleanup();//释放套接字资源;return -1;}if(buf[0] == '0')break;cout << "客户端发送的数据: " << buf <> sendBuf;send(sClient, sendBuf, strlen(sendBuf), 0);}//退出closesocket(sServer);//关闭套接字closesocket(sClient);//关闭套接字WSACleanup();//释放套接字资源;return 0;}客户端程序:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172#include "winsock2.h"#include #pragma comment(lib, "ws2_32.lib")using namespace std;BOOL RecvLine(SOCKET s, char* buf); //读取一行数据int main(int argc, char* argv[]){const int BUF_SIZE = 64;WSADATA wsd; //WSADATA变量SOCKET sHost; //服务器套接字SOCKADDR_IN servAddr; //服务器地址char buf[BUF_SIZE]; //接收数据缓冲区char bufRecv[BUF_SIZE];int retVal; //返回值//初始化套结字动态库if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){cout << "WSAStartup failed!" << endl;return -1;}//创建套接字sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(INVALID_SOCKET == sHost){cout << "socket failed!" << endl;WSACleanup();//释放套接字资源return-1;}//设置服务器地址和端口servAddr.sin_family =AF_INET;servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");servAddr.sin_port = htons((short)4999);int nServAddlen= sizeof(servAddr);//连接服务器retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));if(SOCKET_ERROR == retVal){cout << "connect failed!" << endl;closesocket(sHost); //关闭套接字WSACleanup(); //释放套接字资源return -1;}while(true){//向服务器发送数据ZeroMemory(buf, BUF_SIZE);cout << " 向服务器发送数据:";cin >> buf;retVal = send(sHost, buf, strlen(buf), 0);if (SOCKET_ERROR == retVal){cout << "send failed!" << endl;closesocket(sHost); //关闭套接字WSACleanup(); //释放套接字资源return -1;}//RecvLine(sHost, bufRecv);ZeroMemory(bufRecv, BUF_SIZE);recv(sHost, bufRecv,BUF_SIZE , 0); // 接收服务器端的数据, 只接收5个字符cout << endl <<"从服务器接收数据:"<< bufRecv;cout<<"n";}//退出closesocket(sHost); //关闭套接字WSACleanup(); //释放套接字资源return 0; }
