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 ...
随机推荐
- Lind.DDD.Events事件总线~自动化注册
回到目录 让大叔兴奋的自动化注册 对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它 ...
- WCF入门教程1——WCF简要介绍
什么是WCF Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windo ...
- jquery点击复选框触发事件给input赋值
体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/31.htm 代码如下: <!DOCTYPE html> <html xmlns=" ...
- JavaScript 变量
一,JavaScript 变量(存储信息的容器) 与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y). 变量可以使用短名称(比如 x 和 y),也可以使用描 ...
- Java语言面向对象的一些基本特点
封装 1. 面向对象语言使用class封装属性和方法. 2. 属性一般要求定义为private,封装保护 继承. 继承的例子随处可见.需要符合is-a关系,父类更加通用,子类更加具体.. 在子类中使用 ...
- 关于印发利用DEM确定耕地坡度分级技术规定(试行)的通知
下载:http://files.cnblogs.com/files/gisoracle/%E5%88%A9%E7%94%A8DEM%E7%A1%AE%E5%AE%9A%E8%80%95%E5%9C%B ...
- IOS Emoji表情
IOS Emoji 前言:我比较喜欢有趣的东西,有一些有趣的小东西,可能不是多么多么牛逼,也可能不需要多高深的技巧,也不会为其他什么强大的功能而服务,但是有时候将很多有趣的小东西组合起来运用,比如在你 ...
- iOS开发之功能模块--本地序列化
下面只展示项目开发中,本地序列化的示例代码: AuthenticationManager.h #import <Foundation/Foundation.h> #import " ...
- [sql查询] 重复数据只取一条
SELECT * FROM tab_init WHERE id IN ( --根据Data分类获取数据最小ID列表 select max(id) from tab_init group by a,b ...
- VIEW SERVER STATE permission was denied on object 'server', database 'master'
今天一同事反馈使用SQL Server 2012 Management Studio连接SQL Server 2014后,选择数据库中某个表,然后单击右键时,就会遇到下面错误: 这个错误初看以为是权限 ...