Socket服务端和客户端(C++,CodeBlocks+GCC编译)
//main.cpp
1 #include "j_socket.h"
#include <stdio.h>
#include <pthread.h>
static int port=;
j_server* ser;
void* main_listen( void* args)
{
ser=new j_server(port);
ser->j_listen();
}
int main()
{
static pthread_t listen_p;
int ret;
ret= pthread_create( &listen_p, NULL, main_listen, NULL ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数
if( ret != ) //创建线程成功返回0
{
printf("pthread_create error:error_code=%d\n",ret );
}
static j_client* cli;
cli =new j_client("127.0.0.1",port);
cli->j_send();
return ;
}
//j_socket.h
1 #ifndef J_SOCKET_H_INCLUDED
#define J_SOCKET_H_INCLUDED
#include <stdio.h>
#include <errno.h>
#include <winsock2.h>
#include <pthread.h> #define INIT_ERROR 1
#define BIND_ERROR 2
#define LISTEN_ERROR 3
struct rec_args{
int * l;
SOCKET* s;
};
void* receive( void* args)
{
char recvBuf[];
rec_args *a=(rec_args*)args;
while(true)
{
recv(*(a->s),recvBuf,,);
printf("receive message: %s\n",recvBuf);
printf("111111\n");
if(strcmp(recvBuf,"end")==){break;} }
closesocket(*(a->s));
(*(a->l))--;
printf("22222\n");
return NULL;
}
class j_server
{
private:
SOCKET Server_Sock;
SOCKADDR_IN server_addr;
SOCKADDR_IN client_addr; int max_num;
int link_num=;
int error_num; public:
j_server(int port)
{
WSADATA wsa;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(,),&wsa) != )
{
error_num=INIT_ERROR;
return;
} if((Server_Sock = socket(AF_INET, SOCK_STREAM, ))==-)
{
error_num=INIT_ERROR;
return;
}
ZeroMemory((char *)&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port); /*本地监听端口*/
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); /*有IP*/ if(bind(Server_Sock,(struct sockaddr *)&server_addr,sizeof(server_addr))==-)
{
error_num=BIND_ERROR;
return;
}
if(listen(Server_Sock,)==-) //其中第二个参数代表能够接收的最多的连接数
{
error_num=LISTEN_ERROR;
return;
}
max_num=; }
int j_listen()
{
int len=sizeof(SOCKADDR);
while(true)
{
if(link_num>max_num)
{
Sleep();
continue;
}
SOCKET Command_Sock = accept(Server_Sock, (SOCKADDR*)&client_addr,&len);
if(Command_Sock == INVALID_SOCKET)
{
printf("accept error !");
closesocket(Command_Sock);
}
link_num++;
pthread_t listen_p;
int ret;
rec_args a;
a.l=&link_num;
a.s=&Command_Sock;
ret= pthread_create( &listen_p, NULL, receive,(void *)&a ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数
}
return ;
} };
class j_client
{
private:
SOCKET Client_Sock;
SOCKADDR_IN server_addr;
char sendBuf[];
int error_num;
public: j_client(char * server_addr_str,int port)
{
WSADATA wsa;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(,),&wsa) != )
{
error_num=INIT_ERROR;
return; //代表失败
}
if((Client_Sock = socket(AF_INET, SOCK_STREAM, ))==-)
{
error_num=INIT_ERROR;
return; //代表失败
}
server_addr.sin_addr.S_un.S_addr=inet_addr(server_addr_str);
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(port);
if(connect(Client_Sock,(SOCKADDR*)&server_addr,sizeof(SOCKADDR)) ==-)
{
printf("connect error !");
//printf( "%d ", WSAGetLastError());
}
}
int j_send()
{
while(true)
{
printf("input message: ");
scanf("%s",sendBuf);
if(send(Client_Sock,sendBuf,strlen(sendBuf)+,)!=(strlen(sendBuf)+))
{
printf("send error !");
//printf( "%d ", WSAGetLastError());
}
}
return ;
}
int j_close()
{
closesocket(Client_Sock);
WSACleanup();
}
}; #endif // J_SOCKET_H_INCLUDED
Socket服务端和客户端(C++,CodeBlocks+GCC编译)的更多相关文章
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
- Python3学习之路~8.3 socket 服务端与客户端
通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...
- C# Socket服务端和客户端互相send和receive
服务端 { ]; ; { ...
- socket系列之socket服务端与客户端如何通信
上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...
- PHP socket服务端与客户端的简易通信
今天学习socket通信的同时,顺便整理了下以前初识socket的知识. 现在关于php的socket通信,有些框架已经十分成熟了,比如 swoole 和 workerman,这两个大家可以学习学习 ...
- Socket服务端和客户端文件传输
很多朋友在使用socket编程时不可避免的都做过文件传输,而视频电影等需要一个字节一个字节的传输:但是客户端一般都通过-1进行终止,服务也一样:但是存在的问题是客户端永远不会把-1传递给服务端:因此经 ...
- golang的socket服务端与客户端
服务端 服务端的处理流程 监听端口 接收客户端的链接 创建goroutine,处理该链接 package main import ( "fmt" "net" ) ...
- Android—Socket服务端与客户端用字符串的方式互相传递图片
发送图片: 首先找到具体传递的图片: private Bitmap getimage(String srcPath) { BitmapFactory.Options newOpts = new Bit ...
- 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...
随机推荐
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
- 一个简单的MVC实例及故障排除
Controller: public ActionResult Index() { string setting = "ApplicationServices"; var conn ...
- 微信JSApi支付~坑和如何填坑
返回目录 微信一直用着不爽,这几天研究它的jsapi支付,即在微信内打开H5页面,完成支付的过程,在这个过程中,你将会遇到各种各样的问题,而大叔将把这些问题的解决方法写一下,希望可以给你带来帮助! 一 ...
- wampsever在线模式和离线模式有什么区别
我们在开发网站的时候经常会使用到wampsever服务器,在测试项目的时候我们会经常发现,wampsever服务器在线模式和离线模式都可以使用并且测试,还有一个现象就是我们在测试无线网络,用手机访问的 ...
- 2、Python运算符与表达式
1.运算符 >>>3+5 8 >>>3-5 2 >>>2*3 6 >>>2**3 8 #幂 >>>4/2 2. ...
- No.025:Reverse Nodes in k-Group
问题: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...
- a标签 不触发 目标链接
1. a 标签 点击时 页面回调转到href制定的页面 <a href="www.baidu.com">go to baidu</a> 2. 加上oncli ...
- ABP 初探 之User、Role、Permission数据库设计 (EntityFramework 继承的另一种使用方法)
最近群里(134710707)的朋友都在讨论ABP源码,我把最近学习的内容记录下来,同时也分享给大家,希望正在研究ABP源码的朋友有一定帮助. 上篇介绍ABP的多语言,本篇主要介绍权限的数据库设计,用 ...
- IOS开发基础知识--碎片2
六:获得另一个控件器,并实现跳转 UIStoryboard* mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboa ...
- iOS程序破解——获取.ipa程序包
原文在此 首先肯定不是获取自己的ipa包. 为什么要获取ipa包呢?比如,在仿写一些程序时,避免不了获取它的图片素材等等,那么最快也是最有效的方式就是获取原程序的ipa包.更或者,你想要逆向分析某一款 ...