c++ socket编程(c++ socket编程如何同时运行客户端服务端)

      最后更新:2024-02-07 10:44

      c++csocket编程 5种模式

      1.构造CSocket对象,如以下的形式: CSocket Serversocket;2.利用CSocket对象的Create()函数创建Windows Socket,Create()函数会调用Bind()函数将此Socket绑定到指定的地址上,其原型为:BOOL Create (UINT nSocketPort = 0,int nSocketType = SOCK_STREAM,LPCTSTR lpszSocketAddress = NULL);其中nSocketPort参数指定通信连接的端口号,端口号可以任意指定,但最好不要使用系统默认的一些端口号,例如21是FTP文件传输使用的端口号;3.Socket创建完毕之后,在服务器端进行监听客户的连接请求,使用如下的代码:ServerSocket.Listen();紧接着对于客户端而言,将会调用Connect()函数向服务器发送连接请求,而对于服务器而言,则会调用Accept()函数对客户端发送过来的请求连接进行接受和处理,Accept()函数可以创建一个和监听Socket相同的连接Socket来处理客户的请求,二原来的Socket仍然处于监听状态,使用的形式如下。客户端:ClientSocket.Connect(服务器的地址,服务器的端口号);服务器端:CSocket ReceiveSocket;ServerSocket.Accept(连接Socket,客户的地址结构,客户地址结构的长度)4.对于数据流服务器类型而言,服务器和客户各自通过调用函数来完成数据的发送和接受,使用如下的语句:ServerReceive.Receive(缓冲区,缓冲区的长度,接受标志位);Client.Send(缓冲区,缓冲区的长度,发送标志位);5.在客户端与服务器端的数据传输完成之后,调用下述语句,释放Socket所占有的资源。ServerSocket.Close();ReceiveSocket.Close(); ClientSocket.Close();
      c++csocket编程 5种模式

      socket非阻塞方式下的Linux c++编程步骤是怎样的

      Windows用以下方法将socket设置为非阻塞方式 : unsigned long ul=1;SOCKET s=socket(AF_INET,SOCK_STREAM,0);int ret=ioctlsocket(s, FIONBIO, (unsigned long *)&ul);//设置成非阻塞模式。if(ret==SOCKET_ERROR)//设置失败。{}Linux用以下方法将socket设置为非阻塞方式int flags = fcntl(socket, F_GETFL, 0);fcntl(socket, F_SETFL, flags | O_NONBLOCK);用以下方法将socket设置为非阻塞方式int flags = fcntl(socket, F_GETFL, 0);fcntl(socket, F_SETFL, flags | O_NONBLOCK);将非阻塞的设置回阻塞可以用int flags = fcntl(socket, F_GETFL, 0);fcntl(socket, F_SETFL, flags & ~O_NONBLOCK);功能描述:根据文件描述词来操作文件的特性。用法:int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock *lock);参数:fd:文件描述词。cmd:操作命令。arg:供命令使用的参数。lock:同上。有以下操作命令可供使用一. F_DUPFD :复制文件描述词 。二. FD_CLOEXEC :设置close-on-exec标志。如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭。三. F_GETFD :读取文件描述词标志。四. F_SETFD :设置文件描述词标志。五. F_GETFL :读取文件状态标志。六. F_SETFL :设置文件状态标志。其中O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY 和 O_TRUNC不受影响,可以更改的标志有 O_APPEND,O_ASYNC, O_DIRECT, O_NOATIME 和 O_NONBLOCK。七. F_GETLK, F_SETLK 和 F_SETLKW :获取,释放或测试记录锁,使用到的参数是以下结构体指针:F_SETLK:在指定的字节范围获取锁(F_RDLCK, F_WRLCK)或者释放锁(F_UNLCK)。如果与另一个进程的锁操作发生冲突,返回 -1并将errno设置为EACCES或EAGAIN。F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会立即返回并将errno置为EINTR。F_GETLK:获取文件锁信息。F_UNLCK:释放文件锁。 为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。
      socket非阻塞方式下的Linux c++编程步骤是怎样的

      在C++中编辑scoket

      //从我以前的一个程序里面抠一段出来给你看看 //客户端用不到bind、accept的#include using namespace std;namespace NetWorks{#include #include "winsock2.h"#pragma comment(lib,"Ws2_32.lib")#define BUFFSIZE 65535#define HTTP_GET "GET %s HTTP/1.1rnAccept: */*rnAccept-Language: zh-cnrnUA-CPU: x86rnAccept-Encoding: gzip, deflaternUser-Agent: KingKe/3.0 (USTC0611)rnHost: %srnConnection: Keep-AlivernCookie: %srnrn"#define HTTP_POST "POST /%s HTTP/1.1rnAccept: */*rnAccept-Language: zh-cnrnUA-CPU: x86rnAccept-Encoding: gzip, deflaternUser-Agent: KingKe/3.0 (USTC0611)rnHost: %srnContent-Type: application/x-www-form-urlencodedrnContent-Length: %drnConnection: Keep-Alivernrn%srnrn"typedef struct sockaddr_in NetAddr;bool Start;class WinSocket{public:WSADATA wsd;int Socket;int Error;char *Buff;NetAddr Destination;WinSocket(int AF,int Type,int Protocol);int Connect(const char*name,int PortNum=80){HOSTENT* Host;Host=gethostbyname(name);memcpy(&Destination.sin_addr, Host->h_addr_list[0],Host->h_length);Destination.sin_family = Host->h_addrtype;Destination.sin_port = htons(PortNum);Socket=socket(AF_INET,SOCK_STREAM,0);Error=connect(Socket,(struct sockaddr*)&Destination, sizeof(Destination));return 1;}int Send(char*SendBuffer){return send(Socket,SendBuffer,strlen(SendBuffer),0);}int Receive(char*ReceiveBuffer){return recv(Socket,ReceiveBuffer,BUFFSIZE,0);}void Close(){closesocket(Socket);}~WinSocket(){closesocket(Socket);}};}using namespace NetWorks;void main(int argc,char *arg[]){char Buff[BUFFSIZE]="";char host[50]="202.38.11.11";//主机char dir[50]="/index.html";//页面相对路径WSADATA wsd;WSAStartup(WINSOCK_VERSION,&wsd);WinSocket WS;WS.Connect(host);sprintf(Buff,HTTP_GET,dir,host,"");//GET方法//sprintf(Buff,HTTP_GET,dir,host,"");//POST方法WS.Send(Buff);Buff[WS.Receive(Buff)]=0;cout<
      在C++中编辑scoket

      C++ socket编程 和 MFC socket编程 有什么区别??

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

      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编程,如何监听多个端口,比如监听两个端口,关键代码该怎么写,求教求教,求代码!

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类