socket

select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

假装没事ソ 提交于 2021-02-18 04:02:03
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h> #include <unistd.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作: FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 FD_SET(int fd, fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。 FD_CLR(int fd, fd

Go语言开发分布式聊天室

穿精又带淫゛_ 提交于 2021-02-10 07:37:11
声明 我是一个刚学go语言的菜鸟,还没有资格谈论什么技术分享,只是为了展示fooking的实际应用,同时把我用go写的聊天室代码贴出来供大家消遣,如果有入不了各位法眼的代码,望轻喷。该聊天室基于fooking,而业务代码是采用Go + Fastcgi。 完整的源代码在 https://github.com/scgywx/fooking/blob/master/example/chat/gateway.go ,全代码200多行,去掉router部分代码,实际逻辑代码只有170来行,逻辑简单,功能强大。 详解 聊天服务器的入口main函数里有3个IP和端口配置,分别是Chat服务器、Router服务器和Redis服务器。 func main() { listener, _ := net.Listen("tcp", "0.0.0.0:9001")//Chat服务器配置 srv := newChatServer("test:9010", "test:6379");//Router配置与Redis配置 fcgi.Serve(listener, srv) } Chat服务器就是实现主要的聊天逻辑,Router服务器是用于转发消息,Redis用来存储用户信息。上面我讲过这个聊天室是基于fooking,所以客户端不是直接与go通信,而是透过fooking来访问的

golang实现异步并发sokect

点点圈 提交于 2021-02-02 05:44:39
搜索golang + epoll的例子,得到下面这段代码,感觉golang的编程思维真正做到了并行编程: package main import ( "fmt" "net" "os" "time" ) const ( MAX_CONN_NUM = 5 ) //echo server Goroutine func EchoFunc(conn net.Conn) { defer conn.Close() buf := make([]byte, 1024) for { _, err := conn.Read(buf) if err != nil { //println("Error reading:", err.Error()) return } //send reply _, err = conn.Write(buf) if err != nil { //println("Error send reply:", err.Error()) return } } } //initial listener and run func main() { listener, err := net.Listen("tcp", "0.0.0.0:8088") if err != nil { fmt.Println("error listening:", err.Error()) os.Exit(1)

linux mysql的启动

|▌冷眼眸甩不掉的悲伤 提交于 2021-01-31 00:59:19
如果出现Can't connect to local MySQL server through socket 说明没有启动mysql服务 启动命令执行service mysqld start就行了 之后用命令mysql进入 修改密码后用命令mysql -u root -p进入 来源: oschina 链接: https://my.oschina.net/u/125259/blog/310214

socket简易聊天室

孤人 提交于 2021-01-24 01:42:01
服务器端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @version 2012-7-26 下午04:04:18 **/ public class server { // 服务器端口 private static final int SERVERPORT = 54321; // 客户端连接 private static List<Socket> mClientList = new ArrayList<Socket>(); // 线程池 private ExecutorService mExecutorService; //

python网络编程之socket

时光毁灭记忆、已成空白 提交于 2021-01-16 03:28:34
Python Socket模块学习之详解 ###1.概述 socket套接字编程遵循客户-服务端架构; python中的socket模块,是对套接字编程的实现,主要支持tcp、udp; tcp是可靠的、面向连接的、尽力传输的协议; udp是不可靠的、面向非连接的、不尽力传输的协议; 不可靠不代表它没有用,udp有自己的应用场景,语音和视频几乎都在使用udp协议,它的不可靠只是相对于tcp来说的,但是它的好处就是效率,高效在某些场景要比可靠性重要; ###2.socket模块函数注解 创建套件字: s.socket() 根据地址族family、套件字类型socktype、使用的协议proto创建套件字 family : AF_INET (the default), AF_INET6 or AF_UNIX socktype : SOCK_STREAM (the default, tcp), SOCK_DGRAM(udp) proto : 默认为0, 一般不使用 服务器端套接字方法: socket.bind(address) 绑定地址到套接字对象,地址为主机、端口对 s.listen() 监听端口 s.accept() 被动的阻塞式的接受连接 客户端套接字方法: s.connect() 初始化连接 s.connect_ex() connect()的扩展版本

socket 通信

送分小仙女□ 提交于 2021-01-04 07:04:23
客户端 在项目中导入 IPAddress.h, IPAddress.c 这两个类 导入相应的头文件 #import <UIKit/UIKit.h> #import <sys/types.h> #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> #import <stdio.h> #import <stdlib.h> #import <string.h> #import <unistd.h> #import <netdb.h> #import "IPAddress.h" 实现代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.navigationController.navigationBar.translucent = NO; [self setBtn]; //[self createConnect]; } -(void)setBtn { _IPtextField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 280, 40)]; _IPtextField.delegate =

Java Socket实战之三 传输对象

☆樱花仙子☆ 提交于 2020-12-24 05:33:46
本文地址: http://blog.csdn.net/kongxx/article/details/7259827 Java Socket实战之一 单线程通信 Java Socket实战之二 多线程通信 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象。 首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了,入下: package com.googlecode.garbagecan.test.socket.sample3; public class User implements java.io.Serializable { private static final long serialVersionUID = 1L; private String name; private String password; public User() { } public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName

Socket缓冲区疑问

為{幸葍}努か 提交于 2020-12-24 03:29:45
Socket的发送缓冲区大小为64512=63k,接收缓冲区大小为8192=8k,server端接收到client连接时启动一个线程,线程进入阻塞状态(接收第二个连接时才开始读取客户端数据),客户端程序开始读取本地文件(大于1M)往服务器发送数据,每次往输出流1k数据,发送到第80次时客户端也阻塞了,也就是前79次的数据要么已经到达服务器,要么在本地缓存,问题来了,79次*1k/次 - 客户端发送缓存63k - 服务器接收缓存8k = 8k,这8k数据在什么地方? Server.java private static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) throws Throwable { ServerSocket serverSocket = new ServerSocket(80); int i = 1; while (i++ <= 2)//等待两个客户端连接,第一个客户端连接将阻塞 { new Thread(new Client(serverSocket.accept())).start(); } latch.countDown(); serverSocket.close(); } static class Client implements

libevent 一个简单的event示例

蓝咒 提交于 2020-12-03 14:14:35
本示例程序使用libevent监控一个处于监听状态的tcp服务端socket, 并在有连接进来时打印一条消息。 #include <event.h> int sock_fd; // tcp侦听句柄 // 事件回调函数,当有socket连接时执行 void event_occurs(int fd, short evt, void *arg) { if ( evt == EV_READ && fd == sock_fd ) printf("new connection\n"); else if ( evt == EV_TIMEOUT) printf("event timeout\n"); } int main (int argc, char **argv) { int sock_fd = open_server_socket(); // 调用一个自定义的socket端口侦听函数 // 返回socket句柄。 struct event evt; // 声明一个event struct timeval timeout = {30, 0}; // 设置一次event超时为30秒 event_init(); // 初始化当前libevent, 在调用其他libevent函数之前调用一次 // 将socket句柄、监控的触发事件(EV_READ),事件发生后的回调函数、 // 回调函数参数