Socket服务端和客户端(C++,CodeBlocks+GCC编译)

//main.cpp 1 #include "j_socket.h"
 2 #include <stdio.h>
 3 #include <pthread.h>
 4 static int port=21;
 5 j_server* ser;
 6 void* main_listen( void* args)
 7 {
 8     ser=new j_server(port);
 9     ser->j_listen();
10 }
11 int main()
12 {
13     static pthread_t listen_p;
14     int ret;
15     ret= pthread_create( &listen_p, NULL, main_listen, NULL ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数
16     if( ret != 0 ) //创建线程成功返回0
17     {
18         printf("pthread_create error:error_code=%d\n",ret );
19     }
20     static j_client* cli;
21     cli =new j_client("127.0.0.1",port);
22     cli->j_send();
23     return 0;
24 }
//j_socket.h  1 #ifndef J_SOCKET_H_INCLUDED
  2 #define J_SOCKET_H_INCLUDED
  3 #include <stdio.h>
  4 #include <errno.h>
  5 #include <winsock2.h>
  6 #include <pthread.h>
  7 
  8 #define INIT_ERROR 1
  9 #define BIND_ERROR 2
 10 #define LISTEN_ERROR 3
 11 struct rec_args{
 12 int * l;
 13 SOCKET* s;
 14 };
 15 void* receive( void* args)
 16 {
 17     char recvBuf[512];
 18     rec_args *a=(rec_args*)args;
 19     while(true)
 20     {
 21         recv(*(a->s),recvBuf,512,0);
 22         printf("receive message: %s\n",recvBuf);
 23         printf("111111\n");
 24         if(strcmp(recvBuf,"end")==0){break;}
 25 
 26     }
 27     closesocket(*(a->s));
 28     (*(a->l))--;
 29     printf("22222\n");
 30     return NULL;
 31 }
 32 class j_server
 33 {
 34 private:
 35     SOCKET Server_Sock;
 36     SOCKADDR_IN server_addr;
 37     SOCKADDR_IN client_addr;
 38 
 39     int max_num;
 40     int link_num=0;
 41     int error_num;
 42 
 43 public:
 44     j_server(int port)
 45     {
 46         WSADATA wsa;
 47         /*初始化socket资源*/
 48         if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
 49         {
 50             error_num=INIT_ERROR;
 51             return;
 52         }
 53 
 54         if((Server_Sock = socket(AF_INET, SOCK_STREAM, 0))==-1)
 55         {
 56             error_num=INIT_ERROR;
 57             return;
 58         }
 59         ZeroMemory((char *)&server_addr,sizeof(server_addr));
 60         server_addr.sin_family = AF_INET;
 61         server_addr.sin_port = htons(port);           /*本地监听端口*/
 62         server_addr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/
 63 
 64         if(bind(Server_Sock,(struct sockaddr *)&server_addr,sizeof(server_addr))==-1)
 65         {
 66             error_num=BIND_ERROR;
 67             return;
 68         }
 69         if(listen(Server_Sock,5)==-1) //其中第二个参数代表能够接收的最多的连接数
 70         {
 71             error_num=LISTEN_ERROR;
 72             return;
 73         }
 74         max_num=20;
 75 
 76     }
 77     int j_listen()
 78     {
 79         int len=sizeof(SOCKADDR);
 80         while(true)
 81         {
 82             if(link_num>max_num)
 83             {
 84                 Sleep(100);
 85                 continue;
 86             }
 87             SOCKET Command_Sock  = accept(Server_Sock, (SOCKADDR*)&client_addr,&len);
 88             if(Command_Sock == INVALID_SOCKET)
 89             {
 90                 printf("accept error !");
 91                 closesocket(Command_Sock);
 92             }
 93             link_num++;
 94             pthread_t listen_p;
 95             int ret;
 96             rec_args a;
 97             a.l=&link_num;
 98             a.s=&Command_Sock;
 99             ret= pthread_create( &listen_p,  NULL, receive,(void *)&a  ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数
100         }
101         return 0;
102     }
103 
104 };
105 class j_client
106 {
107 private:
108     SOCKET Client_Sock;
109     SOCKADDR_IN server_addr;
110     char sendBuf[512];
111     int error_num;
112 public:
113 
114     j_client(char * server_addr_str,int port)
115     {
116         WSADATA wsa;
117         /*初始化socket资源*/
118         if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
119         {
120             error_num=INIT_ERROR;
121             return;   //代表失败
122         }
123         if((Client_Sock = socket(AF_INET, SOCK_STREAM, 0))==-1)
124         {
125             error_num=INIT_ERROR;
126             return;   //代表失败
127         }
128         server_addr.sin_addr.S_un.S_addr=inet_addr(server_addr_str);
129         server_addr.sin_family=AF_INET;
130         server_addr.sin_port=htons(port);
131         if(connect(Client_Sock,(SOCKADDR*)&server_addr,sizeof(SOCKADDR)) ==-1)
132         {
133             printf("connect error !");
134             //printf( "%d ", WSAGetLastError());
135         }
136     }
137     int j_send()
138     {
139         while(true)
140         {
141             printf("input message:  ");
142             scanf("%s",sendBuf);
143             if(send(Client_Sock,sendBuf,strlen(sendBuf)+1,0)!=(strlen(sendBuf)+1))
144             {
145                 printf("send error !");
146                 //printf( "%d ", WSAGetLastError());
147             }
148         }
149         return 0;
150     }
151     int j_close()
152     {
153         closesocket(Client_Sock);
154         WSACleanup();
155     }
156 };
157 
158 
159 
160 #endif // J_SOCKET_H_INCLUDED

原文链接: https://www.cnblogs.com/maxuewei2/p/5273914.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/230163

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午2:34
下一篇 2023年2月13日 下午2:34

相关推荐