c++ socket编程(c++ socket编程实现聊天程序)

      最后更新:2022-11-05 16:12:33 手机定位技术交流文章

      在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编程出错的问题

      if(connect(client,(const struct sockaddr *)&clientService,sizeof(clientService))==SOCKET_ERROR) {printf("Failed to connect.n");WSACleanup();return; }
      关于C++ socket编程出错的问题

      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种模式

      c++ socket 创建线程

      线程的使用在socket应用还是非socket应用是都是相同的没有什么区别只需要在应用中需要使用线程的地方创建线程就可以了一般socket服务器线程模型是指在服务器接收到新的链接时会创建一个线程来与该链接进行数据交流在accept成功返回后就立即创建一个线程,并将一些与之链接相关的私有数据传递给该线程后服务器会继续等待新的链接而之前的链接则交由新创建的线程来服务一个简单的模型类型于这样1、等待链接2、链接成功,创建一个新线程,并将相关数据传递给该线程3、再回到1下面以linux下的一个简单的echo服务器(回显服务,回显任何接收到的数据)为例(socket编程的方法大致都是相通的,linux和windows都大相径庭,只是稍有不同而已,在线程模型上都是一样的)说明socket的多线程服务器模型#include #include #include #include #include #include #include #define PORT htons(8888)typedef struct sockaddr SA;typedef struct sockaddr_in SA_IN;typedef struct{    int sockfd;    SA_IN addr;}DATA;void err_quit(const char *msg){    perror(msg);    exit(-1);}void echo(DATA *data){    char buf[1024];    size_t n;    printf("new thread %sn",inet_ntoa(data->addr.sin_addr));    while((n=recv(data->sockfd,buf,sizeof(buf)-1,0)) > 0)    {        if(strncmp(buf,"exit",4) == 0)            break;        send(data->sockfd,buf,n,0);    }    close(data->sockfd);    free(data);    pthread_exit(NULL);}int main(int argc,char **argv){    int sockfd,newfd;    SA_IN addr,serv;    DATA *data;    sockfd=socket(AF_INET,SOCK_STREAM,0);    if(sockfd == -1)        err_quit("socket");    bzero(&serv,sizeof(SA_IN));    serv.sin_family=AF_INET;    serv.sin_port=PORT;    serv.sin_addr.s_addr=INADDR_ANY;    if(bind(sockfd,(SA *)&serv,sizeof(SA)) == -1)        err_quit("bind");    if(listen(sockfd,20) == -1)        err_quit("listen");    while(1)    {        socklen_t addrlen;        pthread_t id;        bzero(&addr,sizeof(SA_IN));        newfd=accept(sockfd,(SA *)&addr,&addrlen);        if(newfd == -1)        {            perror("accept");            continue;        }        data=malloc(sizeof(DATA));        if(data == NULL)        {            close(newfd);            continue;        }        data->sockfd=newfd;        memcpy(&data->addr,&addr,sizeof(SA_IN));        pthread_create(&id,NULL,(void *)echo,data); //创建一个工作线程    }    return 0;}由此可见,在socket中使用线程和其它应用中使用线程是没有任何区别的
      看你的意思,你是想些服务器。你是想用一个线程收数据,另一个线程发送数据么?这样其实没啥意义。如果你是简单的想把数据返回回去,只需要在recv后在send回去就行了,这两个函数默认都是阻塞的。如果是两个线程反而会出现多线程问题。如果你实在要这么弄,你只需要在你的两个线程中弄两个死循环,然后一个死循环里掉recv,另一个掉send就行了。你这其实是一种很低效的并发服务器方案(并发服务器用来解决顺序服务器不能及时响应的问题,也就是你说的主界面等卡死的问题)。你可以去网上百度一下 “网络服务器模型”,上面又很多改良方案。自己去学习吧,代码应该都有。
      只要创建一个线程就可以发送和接收了,就调用下recv和read
      c++ socket 创建线程

      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; }
      C++ SOCKET 服务器端向客户端发消息 �被

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/42844.html

          热门文章

          文章分类